如何使用Java 8/stream API列出,映射和"打印if count> 0"?

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)

  • 在我看来,这是唯一可接受的解决方案.*不要因为一个教程告诉你这么做而只用'流'来做所有事情,只要看一下这里的每一个答案就清楚**这个**的意图是什么,但对于其他人?这只是一团糟 (3认同)

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)

  • @CommonMan不是真的,它在这里是空的非空.我怀疑`Optional`在这里会有用. (3认同)
  • @nullpointer我真的不喜欢这里的任何解决方案,除了你的那个,我认为使用Streams进行日常逻辑只是过度杀伤并且极难理解最简单的逻辑 (3认同)
  • @vikingsteve不喜欢花哨的流而不是可读性. (3认同)