当前位置: 首页 > 知识库问答 >
问题:

如何使用Java8/流API列出、映射和“如果计数>0则打印”?

方奕
2023-03-14

这是我现在的代码。

List<Cat> cats = petStore.getCatsForSale();

if (!cats.empty) 
    logger.info("Processing for cats: " + cats.size());

for (Cat cat : cats) {
    cat.giveFood();
}

我的同事使用Java流API编写了非常好的代码。我试图将其重写为一个流语句,但我被卡住了。

petStore.getCatsForSale().stream.forEach(cat -> cat.giveFood)
    .countTheCats().thenDo(logger.info("Total number of cats: " + x)); // Incorrect... is this possible?

我该怎么做?理想情况下,我想要一个单一的流媒体声明。。。

共有3个答案

白赞
2023-03-14
cats.stream()
    .peek(Cat::giveFood)
    .findAny().ifPresent(cat -> logger.info("Processing for cats: " + cats.size()));
景承教
2023-03-14

我不确定为什么你想使用流作为当前的循环解决方案工作,但你也可以使用

Stream.of(petStore.getCatsForSale())
    .filter(cats -> !cats.isEmpty())
    .flatMap(cats -> {
        logger.info("Processing for cats: " + cats.size());
        return cats.stream();
    })
    .forEach(Cat::giveFood);

也许是一种优化:

Stream.of(petStore.getCatsForSale())
    .filter(cats -> !cats.isEmpty())
    .peek(cats -> logger.info("Processing for cats: " + cats.size()))
    .flatMap(Collection::stream)
    .forEach(Cat::giveFood);

或者使用另一种变体:

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));

农均
2023-03-14

您当前的代码在没有流的情况下要好得多,并且可以进一步缩短为:

if (!cats.isEmpty()) {
    logger.info("Processing for cats: " + cats.size());
}
cats.forEach(Cat::giveFood); // Assuming giveFood is a stateless operation
 类似资料: