代码之家  ›  专栏  ›  技术社区  ›  gene b.

Java Lambda:使用findFirst/ifPresentOrElse快速检查0或1是否来自过滤器并映射到结果变量

  •  0
  • gene b.  · 技术社区  · 4 年前

    answers 其中有0或1个结果,并快速返回(1)该结果或(2)NULL作为my的值 Double result

    // Should be set to either (1) matching ans.getAnswerNumericVal() or (2) NULL
    Double result = answers.stream().filter(ans -> ans.getQuestionId()) == MY_QUESTION_ID)
                                    .findFirst().ifPresentOrElse(ans -> ans.getAnswerNumericVal(), 
                                                                 () -> null);
    

    ifPresentOrElse ,我想将其映射到字段或NULL。

    或者我应该使用 .findFirst().map(ans -> ...) map(..)

    2 回复  |  直到 4 年前
        1
  •  2
  •   João Simões    4 年前

    你可以用 .findFirst().map(ans -> ...) . map

    从文件中:

    如果存在值,则对其应用提供的映射函数,如果结果为非null,则返回描述结果的可选值。否则,返回一个空的可选值。

    因此,您可以:

    Double result = answers
                    .stream()
                    .filter(ans -> ans.getQuestionId() == MY_QUESTION_ID)
                    .findFirst()
                    .map(Answer::getAnswerNumericVal)
                    .orElse(null);
    
        2
  •  1
  •   shmosel    4 年前

    map() 在空的流或选项上。就这么做,然后 orElse(null) :

    Double result = answers.stream()
            .filter(ans -> ans.getQuestionId() == MY_QUESTION_ID)
            .map(ans -> ans.getAnswerNumericVal())
            .findFirst()
            .orElse(null);
    

    我搬家了 地图() 为了避免额外的费用 Optional 实例化,但任何一种方法都有效。