首页 > 解决方案 > 如何在流中返回 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
但是如果没有终止操作,则 Stream 不起作用。如何在流中返回 void?

标签: javajava-stream

解决方案


Stream 由两个强制性(采购、终端)和一个可选(中间)部分组成。

溪流:

  • 采购操作生成(创建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..

但是,不编译。


此外,请注意,Stream API在 Java 中是惰性的。在执行终端操作之前,不会有效地评估中间操作。


推荐阅读