vik*_*eve 18 java functional-programming java-8 java-stream
这是我现在的代码.
List<Cat> cats = petStore.getCatsForSale();
if (!cats.empty)
logger.info("Processing for cats: " + cats.size());
for (Cat cat : cats) {
cat.giveFood();
}
Run Code Online (Sandbox Code Playgroud)
我的同事使用Java流API编写了很好的代码.我尝试将其重写为一个流式语句,但我卡住了.
petStore.getCatsForSale().stream.forEach(cat -> cat.giveFood)
.countTheCats().thenDo(logger.info("Total number of cats: " + x)); // Incorrect... is this possible?
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?理想情况下,我想要一个流媒体声明......
Nam*_*man 18
如果没有流,您当前的代码会更好,并且可以进一步缩短为:
if (!cats.isEmpty()) {
logger.info("Processing for cats: " + cats.size());
}
cats.forEach(Cat::giveFood); // Assuming giveFood is a stateless operation
Run Code Online (Sandbox Code Playgroud)
Lin*_*ica 11
我不确定为什么你想使用流,因为当前的循环解决方案有效,但你也可以使用Stream<List<Cat>>
:
Stream.of(petStore.getCatsForSale())
.filter(cats -> !cats.isEmpty())
.flatMap(cats -> {
logger.info("Processing for cats: " + cats.size());
return cats.stream();
})
.forEach(Cat::giveFood);
Run Code Online (Sandbox Code Playgroud)
也许是一个优化:
Stream.of(petStore.getCatsForSale())
.filter(cats -> !cats.isEmpty())
.peek(cats -> logger.info("Processing for cats: " + cats.size()))
.flatMap(Collection::stream)
.forEach(Cat::giveFood);
Run Code Online (Sandbox Code Playgroud)
或者使用其他变体:
Stream.of(petStore.getCatsForSale())
.filter(cats -> !cats.isEmpty())
.mapToInt(cats -> {
cats.forEach(Cat::giveFood);
return cats.size();
})
.findAny()
.ifPresent(count -> logger.info("Processing for cats: " + count));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
670 次 |
最近记录: |