使用 Stream.reduce() API
reduce()
方法对流的元素使用缩减技术。
在这种情况下,它将选择流的两个元素并选择后者。
这将一直持续到所有元素都用完为止。
在缩减过程结束时,我们将拥有流的最后一个元素。
Stream<Integer> stream = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9) .stream(); Integer lastElement = stream.reduce((first, second) -> second) .orElse(-1); System.out.println(lastElement); // Prints 9
reduce()
方法返回一个 Optional
,它让我们可以选择在返回空元素时要做什么。
例如,流本身可能是空的。
Stream<Integer> emptyStream = Stream.empty(); Integer lastElement = emptyStream.reduce((first, second) -> second) .orElse(-1); System.out.println(lastElement); //-1 //or Stream<Integer> emptyStream = Stream.empty(); Integer lastElement = emptyStream.reduce((first, second) -> second) .orElseThrow(() -> new IllegalStateException("no last element"));
程序输出:
-1 Exception in thread "main" java.lang.IllegalStateException: no last element at com.onitroad.core.streams.misc.GetLastElement.lambda(GetLastElement.java:19) at java.util.Optional.orElseThrow(Unknown Source) at com.onitroad.core.streams.misc.GetLastElement.main(GetLastElement.java:19)
无限流
无限流中不可能找出最后一个元素吗?
必须从有限流中获取最后一个元素。
使用 limit()
从给定的无限流中获取有限流。
Stream<Integer> stream = Stream.iterate(0, i -> i + 1); Integer lastElement = Streams.findLast(stream).orElse(-1); // System.out.println(lastElement);
之路教程 https://onitr oad .com
使用 Streams.findLast() - Guava 库【推荐】
Streams.findLast() 非常简洁、可读并且提供了良好的性能。
它返回指定流的最后一个元素,如果stream流为空,则返回 Optional.empty()
。
Stream<Integer> stream = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9) .stream(); Integer lastElement = Streams.findLast(stream2).orElse(-1); System.out.println(lastElement); // Prints 9
日期:2020-09-17 00:10:04 来源:oir作者:oir