在Java Stream流中,如何获取最后一个元素

使用 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