Rad*_*arz 5 java java-8 java-stream
让我们拥有一系列对象,这些对象来自一系列操作(例如映射,过滤,平面映射等).现在我想对它们执行某个操作,但仅当给定的谓词为真时.否则我想立即返回别的东西.
一个简单的例子.我有一堆不同的食物.如果所有这些都可以食用,我想对它们进行烹饪操作并返回熟食清单.但如果其中任何一个结果不可食用,我想立即返回一个空列表.
我想到的解决方案很少,但我对它们中的任何一个都不满意.
我可以先在流上执行allMatch带isEdible谓词的操作,但它会导致终止它,我需要再次重复初步操作.
在检查可编辑性之前,我可以保留作为初步操作结果的集合,但因此我需要为所有元素执行它们.这是不是最理想的,因为它可能会变成,它们中的第一个是不可食用的,并且allMatch会更早地返回.
或者我可以设计一个hacky reduce例程,但是当谓词失败时它也无法停止处理元素.
我希望的是类似下面的代码.目前的API有可能吗?
source.stream()
// some operations
.ifAny(food -> !food.isEdible(), new LinkedList<Food>())
// other operations if previous step not failed
.peek(food -> food.prepare())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
不完全是您想要的,但使用三元运算符将使您的两步解决方案看起来更干净,它也应该具有最佳性能:
return source.stream()
.allMatch(this::isEdible)
? source.stream()
.map(this::prepare()) // do stuff
.collect(Collectors.toList())
: Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)