这是我现在的代码。
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?
我该怎么做?理想情况下,我想要一个单一的流媒体声明。。。
cats.stream()
.peek(Cat::giveFood)
.findAny().ifPresent(cat -> logger.info("Processing for cats: " + cats.size()));
我不确定为什么你想使用流作为当前的循环解决方案工作,但你也可以使用流
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));
您当前的代码在没有流的情况下要好得多,并且可以进一步缩短为:
if (!cats.isEmpty()) {
logger.info("Processing for cats: " + cats.size());
}
cats.forEach(Cat::giveFood); // Assuming giveFood is a stateless operation
我有一个,另一个作为参数 我想创建一个按类型返回的方法 通常我会写 用java stream写的最佳做法是什么?
我正在寻找第一次到流API的Java8。我尝试创建一个筛选器来从映射中删除元素。
上述代码的输出为:
对于上述代码,我得到的输出为: 但我的期望是得到。 你能指导我实现这一点吗?
我有一个问题,希望有人能帮助我提高Java流API的知识。 我的服务通过RabbitMQ以如下数组的形式从另一个服务接收数据: 我需要对这些数据做的是将其收集到用户具有userId的列表和设备id的列表中。因此,从上面的数据来看,它应该是: 我确实有一个可行的解决方案,但它很笨拙 解决方案是: 如何对流执行相同的操作?谢谢
1)做这件事的正确方法是什么?我做错了什么? 2)流是线程安全的吗?我正在多线程环境中工作,所以我是否应该使用返回TRAAD安全集合的收集器?