A sequence of elements supportingsequential and parallel aggregateoperations
1、Stream是元素的集合;
2、可以支持顺序和并行的对原Stream进行汇聚的操作;
可以把Stream当成一个高级版本的Iterator。原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”等,具体这些操作如何应用到每个元素上,就给Stream就好了!
List<Integer>nums =Lists.newArrayList(1,null,3,4,null,6);
nums.stream().filter(num->num !=null).count();
以上这段代码的意思就是获取列表中不为空的个数。
Stream通用语法:
Stream的创建:
1、通过Stream接口的静态工厂方法
2、通过Collection接口的默认方法
Stream转换
1、1.distinct:对于Stream中包含的元素进行去重操作(去重逻辑依赖元素的equals方法)
2、2.filter:对于Stream中包含的元素使用给定的过滤函数进行过滤操作
3、3.map:对于Stream中包含的元素使用给定的转换函数进行转换操作
4、4.flatMap:和map类似,不同的是其每个元素转换得到的是Stream对象,会把子Stream中的元素压缩到父集合中
5、peek:生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数;
6、limit:对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素;
7、skip:返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream;
使用示例:
List<Integer> nums = Lists.newArrayList(1, null, 3, 4, null, 6);
//distinct
System.out.println("********** distinct **********");
nums.stream().distinct().forEach(x -> System.out.println(x));
//filter
System.out.println("********** filter **********");
nums.stream().filter(num -> num != null && num > 2).forEach(x -> System.out.println(x));
//map
System.out.println("********** map **********");
nums.stream().map(num -> num != null ? num++ : null).forEach(x -> System.out.println(x));
//flatMap
System.out.println("********** flatMap **********");
Stream<List<Integer>> inputStream = Stream.of(Arrays.asList(1), Arrays.asList(2, 3), Arrays.asList(4, 5, 6));
Stream<Integer> outputStream = inputStream.
flatMap((childList) -> childList.stream());
outputStream.forEach(x -> System.out.println(x));
//peek
System.out.println("********** peek **********");
Stream.of("one", "two", "three", "four").filter(e -> e.length() > 3)
.peek(e -> System.out.println("Filtered value: " + e)).map(String::toUpperCase)
.peek(e -> System.out.println("Mapped value: " + e)).collect(Collectors.toList());
// forEach 是 terminal 操作,因此它执行后,Stream 的元素就被“消费”掉了, 你无法对一个 Stream 进行两次 terminal 运算,所以可以使用peek操作
Stream s = Stream.of("one", "two", "three", "four");
s.forEach(e -> System.out.println("forEach1:" + e));
s.forEach(e -> System.out.println("forEach2:" + e));
//limit
System.out.println("********** limit **********");
nums.stream().limit(4).forEach(x -> System.out.println(x));
//skip
System.out.println("********** skip **********");
nums.stream().skip(4).forEach(x -> System.out.println(x));