Java 8系列之Stream的基本语法详解
巧用Java8中的Stream,让集合操作6到飞起!
一定要分清楚map这类操作和foreach一类操作的区别,
map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 skip、 parallel、 sequential、 unordered都是中间操作(Intermediate),
所有中间操作是懒执行,即直到实际需要处理结果时才会执行。执行中间操作实际上并不执行任何操作,而是创建一个新的流,当遍历该流时,它包含与给定谓词匹配的原始流的元素。因此在执行管道的终止操作之前,流的遍历不会开始。forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、iterator操作都是终止操作(Terminal),会改变原来对象或者返回一个新的对象
终止操作可以遍历流生成结果或直接消费。终止操作执行后,可以认为管道流被消费了并不能再被使用。anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit是短路操作(Short-circuiting)。
有时候需要在遍历中途停止操作,比如查找第一个满足条件的元素或者limit操作
对于一个 intermediate 操作,如果它接受的是一个无限大(infinite/unbounded)的 Stream,但返回一个有限的新 Stream。
对于一个 terminal 操作,如果它接受的是一个无限大的 Stream,但能在有限的时间计算出结果。
public class test1 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for(int i=0;i<10;i++) {
list.add(i);
}
for(int i=0;i<10;i++) {
list.add(i);
}
//过滤器,也可以中间.一个distinct来过滤重复元素
List<Integer> list1=list.stream().filter(x->x>5&&x<8).collect(Collectors.toList());
//(oldVal, currVal) -> currVal) // key相同时当前值替换原始值
//(oldVal, currVal) -> oldVal + currVal //key相同时保留原始值和当前值
//将list转成map,因为list中有重复元素,需要用到函数来确认重复元素怎么操作,limit为限制大小为10
Map<Integer, Integer> map = list1.stream()
.limit(10)
.collect(Collectors.toMap(
Integer::intValue, Integer::intValue,((oldVal, currVal) -> currVal))
);
//将打印的map通过函数转成value为1.3倍的map,注意此时需要拿到entrySet后再stream(),map本身不支持stream
Map<Integer, Integer> map2 = map.entrySet().stream()
.collect(Collectors.toMap(
entry -> entry.getKey(), entry -> (int)(entry.getValue()*1.3f))
);
//通过map的操作,将stream流变成value为1.3倍的流,注意map为中间操作,返回值为stream,且不会修改原来对象,此时要在后面加终止操作
//类似于foreach,count方法,将修改返回给原来的对象
map.entrySet().stream().map(
(i)-> i.setValue((int)(i.getValue()*1.3f)))
.forEach(x->System.out.println(x.toString())
);
//简单的打印出map里的内容
map.entrySet().stream().forEach(x->System.out.println(x.toString()));
//list1中数据有6,6,7,7,
//max需要指定一个comparator,而他返回的是其中最后的一个值
Optional<Integer> max = list1.stream().max((o1,o2)->o1-o2);
//输出为7
System.out.println(max.toString());
//min与max类似,注意这里的排序方法已经不是自然排序了,而是倒序,min返回的是最开始的值,所以还是7
Optional<Integer> min = list1.stream().min((o1,o2)->o2-o1);
System.out.println(min.toString());
}
}
网友评论