什么是Stream
Stream是Java 1.8版本开始提供的一个接口,主要提供对数据集合使用流的方式进行操作,流中的元素不可变且只会被消费一次,所有方法都设计成支持链式调用。使用Stream API可以极大生产力,写出高效率、干净、简洁的代码。
如何获得Stream实例
Stream提供了静态构建方法,可以基于不同的参数创建返回Stream实例
使用Collection的子类实例调用stream()或者parallelStream()方法也可以得到Stream实例,两个方法的区别在于后续执行Stream其他方法的时候是单线程还是多线程
Stream stringStream = Stream.of("1", "2", "3");
//无限长的偶数流
Stream evenNumStream = Stream.iterate(0, n -> n + 2);
List strList = new ArrayList<>();
strList.add("1");
strList.add("2");
strList.add("3");
Stream strStream = strList.stream();
Stream strParallelStream = strList.parallelStream();
filter
filter方法用于根据指定的条件做过滤,返回符合条件的流
Stream numStream = Stream.of(-2, -1, 0, 1, 2, 3);
//获得只包含正数的流,positiveNumStream -> (1,2,3)
Stream positiveNumStream = numStream.filter(num -> num > 0);
map
map方法用于将流中的每个元素执行指定的转换逻辑,返回其他类型元素的流
Stream numStream = Stream.of(-2, -1, 0, 1, 2, 3);
//转换成字符串流
Stream strStream = numStream.map(String::valueOf);
mapToInt mapToLong mapToDouble
这三个方法是对map方法的封装,返回的是官方为各个类型单独定义的Stream,该Stream还提供了适合各自类型的其他操作方法
Stream stringStream = Stream.of("-2", "-1", "0", "1", "2", "3");
IntStream intStream = stringStream.mapToInt(Integer::parseInt);
LongStream longStream = stringStream.mapToLong(Long::parseLong);
DoubleStream doubleStream = stringStream.mapToDouble(Double::parseDouble);
flatMap
flatMap方法用于将流中的每个元素转换成其他类型元素的流,比如,当前有一个订单(Order)列表,每个订单又包含多个商品(itemList),如果要得到所有订单的所有商品汇总,就可以使用该方法,如下:
Stream allItemStream = orderList.stream().flatMap(order -> order.itemList.stream());
flatMapToInt flatMapToLong flatMapToDouble
这三个方法是对flatMap方法的封装,返回的是官方为各个类型单独定义的Stream,使用方法同上
distinct
distinct方法用于对流中的元素去重,判断元素是否重复使用的是equals方法
Stream numStream = Stream.of(-2, -1, 0, 0, 1, 2, 2, 3);
//不重复的数字流,uniqueNumStream -> (-2, -1, 0, 1, 2, 3)
Stream uniqueNumStream = numStream.distinct();