如何在流中返回void ?



我有发送订单的列表。当参数的方法名相同时,它会增加

但它不起作用。因为没有终止操作

List<SendingOrdres> sendingOrders = new ArrayList<SendingOrdres>();
private void countUpOrResetSendingOrders(String method) {
sendingOrders.stream()
.filter((e) -> {
System.out.println("filter:"+e);
return e.getMethod().equals(method);
})
.peek((e) -> System.out.println("peek:"+e)) //For check
.map((e)->{
int nextNowSendingOrder = e.getNowSendingOrder()+1;
if(nextNowSendingOrder > e.getMaxSendingOrder()) {
e.setNowSendingOrder(0);
}else {
e.setNowSendingOrder(nextNowSendingOrder);
}
return e;
});
// no Termination operation
}

我在上层代码中添加了终止操作。它运行良好。

.collect(Collectors.toList()); 
我有一个问题。我不需要返回值。所以我想返回void.
但是如果终止操作没有发生,则流没有工作。如何在流中返回void ?

流由两个必需部分(源,终端)和一个可选部分(中间部分)组成。

流:

  • 是由来源操作(创建Stream<T>实例)生成的;
  • 然后,
  • 可选地继续执行一个或多个链接的中间操作;
  • 最终以终端操作终止。

void只能被认为是流中终端操作(即它的lambda(或方法引用)表达式)的返回类型,因为每个中间操作都必须返回流,随后的中间(或终端)操作将在其上进行操作。例如:

List.of(1, 2, 3, 4)
.stream() //sourcing the stream
.forEach(System.out::println); //terminating the stream

是可以的,因为println只是消耗流而不需要返回另一个流。


List.of(1, 2, 3, 4)
.stream() //sourcing the stream
.filter(System.out::println); //ouch..

不能编译。


另外,要注意,流API在Java中是惰性的。在执行终端操作之前,中间操作不能有效求值。

最新更新