java - 如何在流中返回 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?
解决方案
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 中是惰性的。在执行终端操作之前,不会有效地评估中间操作。
推荐阅读
- javascript - 如何创建一个 javascript 函数“类”,以便我可以从函数外部和内部访问“方法”
- java - Spring - 添加低优先级多线程服务(不影响生产性能)
- django - 计算每个月的收入和支出
- c# - 将音频文件实时转换为文本
- c++ - 修复对象初始化,以便调用覆盖的方法
- typescript - 将 firebase 链式方法重写为 promise.all
- php - 在 Laravel 中使用 ajax 上传图片
- r - 如何在 facet wrap 中组织绘图顺序
- angular - 根据复选框值启用/禁用输入表单字段
- ruby-on-rails - 如何在rails中使用reportskit创建多列表格报告?