当前位置: 首页 > 知识库问答 >
问题:

Java具有多个语句的8 Lambda Stream

谢宸
2023-03-14

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

共有3个答案

吕高寒
2023-03-14

在第一种情况下,对于多行foreach,您可以使用peek流操作:

entryList.stream()
         .peek(entry -> entry.setTempId(tempId))
         .forEach(updatedEntries.add(entityManager.update(entry, entry.getId())));

在第二种情况下,我建议将循环体提取到单独的方法中,并使用方法引用通过foreach调用它。即使没有lambdas,它也会使您的代码更加清晰,因为循环体是处理单个条目的独立算法,所以它在其他地方也可能有用,并且可以单独测试

问题编辑后更新。如果您已经检查了异常,那么您有两个选项:要么将它们更改为未检查的异常,要么在这段代码中根本不使用lambda/streams。

卜盛
2023-03-14
List<String> items = new ArrayList<>();
items.add("A");
items.add("B");
items.add("C");
items.add("D");
items.add("E");

//lambda
//Output : A,B,C,D,E
items.forEach(item->System.out.println(item));

//Output : C
items.forEach(item->{
    System.out.println(item);
    System.out.println(item.toLowerCase());
  }
});
强硕
2023-03-14

忘记与第一个代码片段相关了。我根本不会使用foreach。因为您正在将Stream的元素收集到一个List中,所以使用收集来结束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();
  }
});

但是(查看您的注释尝试),您不能在这种情况下使用filter,因为如果您这样做,您将只处理一些条目(例如,entry.getA()==null)。

 类似资料:
  • 问题内容: 我仍在学习Lambda,请原谅我做错了什么 似乎只能对一条语句执行。它不返回更新的流或函数以进行进一步处理。我可能总共选错了一个。 有人可以指导我如何有效地做到这一点吗? 还有一个问题, 如何将其转换为Lambda表达式? 问题答案: 忘记与第一个代码段相关。我根本不会用。由于您将的元素收集到中,因此以结束处理会更有意义。然后,您将需要设置ID。 对于第二个代码段,可以执行多个表达式,

  • 问题内容: 有没有一种方法可以使用IN子句进行CASE语句? 问题答案: 是的。您需要使用表达式的“搜索”形式而不是“简单”形式

  • 我想知道我是否能得到一些帮助,让我的java看起来更好。目前,我正在做一些家庭作业,当我纠正一个if语句的多个条件时,它看起来非常混乱,就像下面的一个。我试着看看str.charat(p)是否等于任何元音,但是这看起来很糟糕,一个接一个地写出来。有更好的办法吗?

  • 问题内容: 我有一个变量。 我想呼应,如果等于任何下列值,,,,或。有没有办法通过像?? 这样的单个语句来做到这一点? 问题答案: 我认为,使用“ Or”代替“ And”会有所帮助

  • 问题内容: 对于我的工作,我必须开发一个小型Java应用程序,该应用程序可以解析非常大的XML文件(约30万行)以选择非常具体的数据(使用),因此我试图对其进行一些优化。我想知道这两个摘要之间哪个更好: 要么 其他详情: 这些if语句在循环内的每次迭代中执行(约20k次迭代) 的是一种在利用外部函数每次迭代计算 如果将设置为,则无需测试正则表达式是否匹配 谢谢你的帮助。 问题答案: 我遵循的一条黄

  • 问题内容: 我试图更新一个名为表,并设置为从表。 我在Postgres 9.3中有以下SQL查询,但是当它触发时,出现以下错误: 我更喜欢Active Record,所以我的SQL原始技能严重缺乏。我想知道是否有人可以帮助我向正确的方向指出如何正确执行此查询。 问题答案: 与Postgres中的有效语句相同: 您不能仅将子句中的表别名用作子句中的目标表。要更新的(一个!)表紧跟在关键字之后(如果我