什么是Stream
Stream是Java 1.8版本开始提供的一个接口,主要提供对数据集合使用流的方式进行操作,流中的元素不可变且只会被消费一次,所有方法都设计成支持链式调用。使用Stream API可以极大生产力,写出高效率、干净、简洁的代码。
如何获得Stream实例
Stream提供了静态构建方法,可以基于不同的参数创建返回Stream实例
使用Collection的子类实例调用stream()或者parallelStream()方法也可以得到Stream实例,两个方法的区别在于后续执行Stream其他方法的时候是单线程还是多线程
Stream<String> stringStream = Stream.of("1", "2", "3"); //无限长的偶数流 Stream<Integer> evenNumStream = Stream.iterate(0, n -> n + 2); List<String> strList = new ArrayList<>(); strList.add("1"); strList.add("2"); strList.add("3"); Stream<String> strStream = strList.stream(); Stream<String> strParallelStream = strList.parallelStream();
filter
filter方法用于根据指定的条件做过滤,返回符合条件的流
Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3); //获得只包含正数的流,positiveNumStream -> (1,2,3) Stream<Integer> positiveNumStream = numStream.filter(num -> num > 0);
map
map方法用于将流中的每个元素执行指定的转换逻辑,返回其他类型元素的流
Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3); //转换成字符串流 Stream<String> strStream = numStream.map(String::valueOf);
mapToInt mapToLong mapToDouble
这三个方法是对map方法的封装,返回的是官方为各个类型单独定义的Stream,该Stream还提供了适合各自类型的其他操作方法
Stream<String> 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)<p style="color:transparent">本文来源gao!%daima.com搞$代*!码$网3</p>;
flatMap
flatMap方法用于将流中的每个元素转换成其他类型元素的流,比如,当前有一个订单(Order)列表,每个订单又包含多个商品(itemList),如果要得到所有订单的所有商品汇总,就可以使用该方法,如下:
Stream<Item> allItemStream = orderList.stream().flatMap(order -> order.itemList.stream());
flatMapToInt flatMapToLong flatMapToDouble
这三个方法是对flatMap方法的封装,返回的是官方为各个类型单独定义的Stream,使用方法同上
distinct
distinct方法用于对流中的元素去重,判断元素是否重复使用的是equals方法
Stream<Integer> numStream = Stream.of(-2, -1, 0, 0, 1, 2, 2, 3); //不重复的数字流,uniqueNumStream -> (-2, -1, 0, 1, 2, 3) Stream<Integer> uniqueNumStream = numStream.distinct();
sorted
sorted有一个无参和一个有参的方法,用于对流中的元素进行排序。无参方法要求流中的元素必须实现Comparable接口,不然会报java.lang.ClassCastException异常
Stream<Integer> unorderedStream = Stream.of(5, 6, 32, 7, 27, 4); //按从小到大排序完成的流,orderedStream -> (4, 5, 6, 7, 27, 32) Stream<Integer> orderedStream = unorderedStream.sorted();