【问题标题】:Set object in lambda expression在 lambda 表达式中设置对象
【发布时间】:2017-10-30 19:12:28
【问题描述】:

如何在 lambda 表达式中将我的对象设置为另一个?我有错误

lambda 表达式中使用的变量应该是最终的或有效的最终

使用以下代码:

public MyObj myFun(MyObj o) {
   MyObj obj = null;

   myObjList.stream().filter(o -> ...).forEach(o -> {
      // I do some stuff here

      // I need here set obj to o, but I got error
      obj = o;
   });

   return myObj; // I need return found obj or null;
}

【问题讨论】:

  • 所以你试图在列表中找到匹配条件的最后一个对象?如果是这样,这可能是 this question 的副本。
  • 你应该使用收集器。
  • 不,你不能在 Java 中这样做。说明你的实际最终目标。
  • @DenisStephanov 好的,但是如果有多个元素与您的过滤器匹配,会发生什么?它应该只使用第一个吗?或者任何人?
  • @DenisStephanov 您正在寻找 findFirst。

标签: java lambda


【解决方案1】:

您不能将o 分配给外部变量。但是您可以将其作为流处理的结果返回。使用map 而不是forEach 并从映射器返回o。然后执行findAny 或findFirst - 这将为您提供Optional<MyObj>。最后执行orElse(null) 以返回找到并处理的对象,如果没有找到则执行null。

MyObj obj = myObjList
   .stream()
   .filter(o -> ...)
   .map(o -> {
       // I do some stuff here

       // I need here set obj to o, but I got error
       return o;
   })
   .findAny()
   .orElse(null);

【讨论】:

  • 到 OP - 如果“map”中的逻辑超过 2-3 行,我会将其提取到另一个方法中并从“map”中调用。
  • 使用 findAny 没有坏处,但在执行并行处理时更常用。
  • 感谢回答,但在“一些东西”中我还需要更新创建的对象,更新后返回它。
  • @Aominè 什么是“patel processing”?
  • 您需要对对象进行的任何更新都可以在完成对流的拖网之后完成。
【解决方案2】:

不要使用forEach,而是考虑使用map(o->{...}).findFirst().get()(或类似的,如果没有相关项目,则取决于您的逻辑 - 您的null案例)。

一般来说,您应该让流在收集器或选择器(findFirst/findAny 等)中结束,因为这样可以让您编写更简单、更清晰的代码

【讨论】:

    【解决方案3】:

    您可以简单地循环遍历它,然后在找到它时返回值,而不是通过它流式传输。

    流式的答案可能是使用findFirst之类的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多