我如何列出、映射和;如果计数>;0“;使用Java8/StreamAPI?

我如何列出、映射和;如果计数>;0“;使用Java8/StreamAPI?,java,java-8,functional-programming,java-stream,Java,Java 8,Functional Programming,Java Stream,这是我现在的代码 List<Cat> cats = petStore.getCatsForSale(); if (!cats.empty) logger.info("Processing for cats: " + cats.size()); for (Cat cat : cats) { cat.giveFood(); } 我该怎么做?理想情况下,我需要一条流语句…没有流,您当前的代码要好得多,可以进一步缩短为: if (!cats.isEmpty()) {

这是我现在的代码

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

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

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

我该怎么做?理想情况下,我需要一条流语句…

没有流,您当前的代码要好得多,可以进一步缩短为:

if (!cats.isEmpty()) {
    logger.info("Processing for cats: " + cats.size());
}
cats.forEach(Cat::giveFood); // Assuming giveFood is a stateless operation
我不确定您为什么要在当前循环解决方案工作时使用流,但您也可以使用

可能是一种优化:

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));
我同意。这是基于他的想法的另一种选择:

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

cats.stream().limit(1)
    .flatMap(c -> {
        logger.info("Processing for cats: " + cats.size());
        return cats.stream();
    }).forEach(Cat::giveFood);
List cats=petStore.getCatsForSale();
cats.stream()限制(1)
.flatMap(c->{
logger.info(“猫的处理:+cats.size());
返回cats.stream();
}).forEach(猫:食物);

什么是计数?你希望每个非空猫都有一个log语句吗?
petStore.getCatsForSale()
是一个
列表
@nullpointer,我知道这段由Java8流组成的难看的代码是有效的,如果我错了,请纠正我当然:)@CommonMan不是真的,这里是空的vs非空的。我怀疑
Optional
在这里是否有用。@nullpointer我真的不喜欢这里的任何解决方案,除了您提供的解决方案,我认为在日常逻辑中使用Streams是一种过火的做法,它使理解最简单的逻辑变得非常困难logic@Spara因此,我在
Cat
-列表中有一个“包装器”流(
Stream
)允许我一次对整个列表进行操作,但仍然在流中。尽管使用
cats.Stream()
,您将得到一个覆盖所有cats(
Stream
)Hi和thx的流作为答案。这可以在一行中完成吗?当然我可以编写
“if(!cats.isEmpty())logger.info(“…”)
但是这个问题的目的是用流来写。在我看来,这是唯一可以接受的解决方案吗?不要用
流来做任何事情,因为一个教程告诉过你这一点,只要看看这里的每个答案,就可以清楚地知道这个答案的意图是什么,但对于其他答案来说,这只是一个问题。为什么不使用
 IntStream.range(1)
?无需使用
cats.stream()。限制(1)
way@Lino由于从
java-9
开始的列表是空的,您可能会让您的猫饿着肚子)))。不再保证执行
peek
。请阅读了解更多详细信息。@ETO请查看标签。标签上写着java-8!@oleg.cherednik。我想ETO想说的是,这个解决方案可能只适用于java-8,这使得它在想要向上迁移版本时不是一个好的解决方案:)@oleg.cherednik是的,我知道。使用
p对于非调试目的,EKE<代码>被认为是有害的。此外,从2019年2月开始,对于CyMeMalCub用户有<代码> Java8/Cuth>。因此,如果编写“代码> Java8/Cuth>代码,请考虑避免潜在的迁移错误。一个可能不会注意到的代码<代码> Java9 <代码> PEEK 不像以前那样工作。我们的代码将有一个隐藏的不可见的bug。
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));
cats.stream()
    .peek(Cat::giveFood)
    .findAny().ifPresent(cat -> logger.info("Processing for cats: " + cats.size()));
List<Cat> cats = petStore.getCatsForSale();

cats.stream().limit(1)
    .flatMap(c -> {
        logger.info("Processing for cats: " + cats.size());
        return cats.stream();
    }).forEach(Cat::giveFood);