具有多个语句的 Java 8 Lambda Stream forEach

标签 java lambda java-8

我还在学习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 表达式?

最佳答案

忘记与第一个代码片段相关。我根本不会使用 forEach 。由于您将 Stream 的元素收集到 List 中,因此使用 collect< 结束 Stream 处理会更有意义。然后你需要 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 的条目)如果你这样做。

关于具有多个语句的 Java 8 Lambda Stream forEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31130457/

相关文章:

Java 8 流条件处理

java - 按住键后做某事并在释放和按下时重复

java - 类似 Django 的 Java 框架

c++ - 如何检测作为参数传递的函数的参数类型?

c# - 通用 orderby 子句的动态表达式

java - 从java中的枚举列表中删除一个元素

java - App Engine - 如何将 JSON 传递到队列

java - 用于匹配交替序列的正则表达式

c++ - 将 std::unique_ptr 与 lambda 交换为删除器——GCC

java - instanceof 和泛型的编译错误