Java8新特性探索之Stream接口 (2)

skip(n)方法正好相反,它会丢弃掉前面的n个元素。

// 查询第二页的数据 Integer pageNumber = 2; Integer pageSize = 10; Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12).skip((pageNumber - 1) * pageSize).limit(pageSize) .forEach(System.out::println);

输出结果:

11 12

消费流元素(终端操作 Terminal Operations)

终端操作总是我们在流管道中所做的最后一件事,该操作将会获取流的最终结果。

1、数组结果输出

toArray():将流转换成适当类型的数组。

toArray(generator):在特殊情况下,生成自定义类型的数组。

2、循环结果输出

forEach(Consumer)常见如 System.out::println 作为 Consumer 函数。

forEachOrdered(Consumer): 保证 forEach 在并行流处理时按照原始流顺序操作。

Arrays.stream(new Random(45).ints(0, 1000).limit(100).toArray()).limit(10).parallel().forEachOrdered(n -> System.out.format("%d ", n));

3、collect收集结果

collect(Collector):使用 Collector 收集流元素到结果集合中。

collect(Supplier, BiConsumer, BiConsumer):同上,第一个参数 Supplier 创建了一个新的结果集合,第二个参数 BiConsumer 将下一个元素收集到结果集合中,第三个参数 BiConsumer 用于将两个结果集合合并起来。

Collectorts类为我们提供了常用的收集类的各个工厂方法:

将一个流收集到一个List中可以这样用

Lists.newArrayList().stream().collect(Collectors.toList());

收集到Set中可以这样用

Lists.newArrayList().stream().collect(Collectors.toSet());

收集到Map中可以这样用

Lists.newArrayList(new User("Johnson", "重庆")).stream().collect(Collectors.toMap(User::getName, User::getAddress));

收集到Set时,控制Set的类型可以这样用

Lists.newArrayList().stream().collect(Collectors.toCollection(TreeSet::new));

将字流中的字符串连接并收集起来

Lists.newArrayList().stream().collect(Collectors.joining(","));

各种聚合操作

// 获取流中的总和,平均值,最大值,最小值,一次性收集流中的结果 List<Integer> listA = Lists.newArrayList(1, 2, 3, 4, 5); listA.stream().collect(Collectors.summingInt(Integer::intValue)); listA.stream().collect(Collectors.averagingInt(Integer::intValue)); listA.stream().collect(Collectors.maxBy(Integer::compareTo)); listA.stream().collect(Collectors.minBy(Integer::compareTo)); listA.stream().collect(Collectors.summarizingInt(Integer::intValue)); // 分组分片,返回结果:{"重庆渝北":[{"address":"重庆渝北","name":"Johnson"},{"address":"重庆渝北","name":"Jack"}],"重庆江北":[{"address":"重庆江北","name":"Tom"}]} List<User> listB = Lists.newArrayList(new User("Johnson", "重庆渝北"), new User("Tom", "重庆江北"), new User("Jack", "重庆渝北")); System.out.println(JSON.toJSONString(listB.stream().collect(Collectors.groupingBy(User::getAddress))));

4、组合流中元素

reduce(BinaryOperator):使用 BinaryOperator 来组合所有流中的元素。因为流可能为空,其返回值为 Optional

// 结果为15 System.out.println(Stream.of(1, 2, 3, 4, 5).reduce((x, y) -> x + y).get());

reduce(identity, BinaryOperator):功能同上,但是使用 identity 作为其组合的初始值。因此如果流为空,identity 就是结果

// 设置初始值为10则结果为25 System.out.println(Stream.of(1, 2, 3, 4, 5).reduce(10, (x, y) -> x + y)); // 集合流为空,则结果默认为初始值a List<String> list = Lists.newArrayList(); System.out.println(list.stream().reduce("a", (x, y) -> x.length() > 1 ? x : y));

reduce(identity, BiFunction, BinaryOperator):在串行流(stream)中,该方法跟第二个方法一样,即第三个参数不会起作用。在并行流中,我们知道流被fork join出多个线程进行执行,此时每个线程的执行流程就跟第二个方法reduce(identity,BiFunction)一样,而第三个参数BinaryOperator函数,则是将每个线程的执行结果当成一个新的流,然后使用第一个方法reduce(BinaryOperator)流程进行规约

// 第三个参数在并行流中起效,将每个线程的执行结果当成一个新的流 List<Integer> listA = Lists.newArrayList(1, 2, 3, 4, 5); // 串行流运行结果:15 System.out.println(listA.stream().reduce(0, (x, y) -> x + y, (i, j) -> i * j)); // 并行流运行结果:120 System.out.println(listA.parallelStream().reduce(0, (x, y) -> x + y, (i, j) -> i * j));

5、流中元素匹配

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfddd.html