为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Java 8 / 流 API 列出、映射和“打印 if count>0”?

如何使用 Java 8 / 流 API 列出、映射和“打印 if count>0”?

弑天下 2022-06-04 16:45:48
这是我现在的代码。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 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

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


if (!cats.isEmpty()) {

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

}

cats.forEach(Cat::giveFood); // Assuming giveFood is a stateless operation


查看完整回答
反对 回复 2022-06-04
?
茅侃侃

TA贡献1842条经验 获得超21个赞

我不确定为什么要在当前循环解决方案中使用流,但您也可以使用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);

也许是优化:


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


查看完整回答
反对 回复 2022-06-04
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

cats.stream()
    .peek(Cat::giveFood)
    .findAny().ifPresent(cat -> logger.info("Processing for cats: " + cats.size()));


查看完整回答
反对 回复 2022-06-04
  • 3 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信