一尘不染

Java 8 Lambda Stream forEach具有多个语句

java

我仍在学习Lambda,请原谅我做错了什么

final Long tempId = 12345L;
List<Entry> updatedEntries = new LinkedList<>();

for (Entry entry : entryList) {
    entry.setTempId(tempId);
    updatedEntries.add(entityManager.update(entry, entry.getId()));
}

//entryList.stream().forEach(entry -> entry.setTempId(tempId));

似乎forEach只能对一条语句执行。它不返回更新的流或函数以进行进一步处理。我可能总共选错了一个。

有人可以指导我如何有效地做到这一点吗?

还有一个问题,

public void doSomething() throws Exception {
    for(Entry entry: entryList){
        if(entry.getA() == null){
            printA() throws Exception;
        }
        if(entry.getB() == null){
            printB() throws Exception;
        }
        if(entry.getC() == null){
            printC() throws Exception;
        }
    }
}
    //entryList.stream().filter(entry -> entry.getA() == null).forEach(entry -> printA()); something like this?

如何将其转换为Lambda表达式?


阅读 875

收藏
2020-12-03

共1个答案

一尘不染

忘记与第一个代码段相关。我根本不会用forEach。由于您将的元素收集Stream到中List,因此以结束Stream处理会更有意义collect。然后,您将需要peek设置ID。

List<Entry> updatedEntries = 
    entryList.stream()
             .peek(e -> e.setTempId(tempId))
             .collect (Collectors.toList());

对于第二个代码段,forEach可以执行多个表达式,就像任何lambda表达式都可以:

entryList.forEach(entry -> {
  if(entry.getA() == null){
    printA();
  }
  if(entry.getB() == null){
    printB();
  }
  if(entry.getC() == null){
    printC();
  }
});

但是,(请看您的评论尝试),在这种情况下您不能使用过滤器,因为entry.getA() == null如果您这样做,它只会处理某些条目(例如,针对的条目)。

2020-12-03