尝试在forEach方法中返回某些内容时,Void方法无法返回值错误

时间:2018-01-21 04:00:34

标签: java

我有一个snippet,如下所示

private String getString() {
    List<String> stringList = Arrays.asList("s1", "s2");
    stringList.forEach(item ->
        {
            if (item.equals("s1"))
                return item;
        });
    return null;
}

现在,当我尝试Void methods cannot return a value时,我收到了编译错误return item。我用Google搜索,无法理解为什么会发生这种情况并解决这个问题。我如何在return item循环中forEach

2 个答案:

答案 0 :(得分:2)

forEach是一个消费过程。传递给forEach方法的函数应该具有副作用, not 不会直接导致返回值,例如打印列表的内容或执行某些操作。< / p>

基本上,任何Consumer或返回void的方法的函数都是公平的游戏。

由于您明确正在寻找值,因此您可以使用Stream#findAny()代替。

// You don't do anything with the result you want anyway,
// so I'm simply printing it out.  You should determine what you need to do
// with the value you get back.

Optional<String> findResult = stringList().stream().findAny(v -> v.equals("s1"));
findResult.ifPresent(System.out::println);

答案 1 :(得分:2)

我认为你误解了lambdas。 lambda是可以立即执行或延迟执行的可执行语句;更重要的是,它有自己的方法签名。

在下面的代码中,您已经定义了一个匿名方法。它的签名是什么?

    stringList.forEach(item ->
    {
        if (item.equals("s1"))
            return item;
    });

答案是您的匿名方法具有以下等效表示:

private void myAnonymousMethod( String item ) {
    if ( item.equals("s1"))
        return item;
}

你现在看到你的错吗?您的匿名方法具有void返回类型,但您尝试返回值。

相反,您可以通过多种方式解决此问题:

  • 当您找到要查找的值时,请将其保存在lambda范围之外的局部变量中。 Pro:为您的代码引入最少量的更改。 Con:foreach循环将在找到第一个匹配后继续执行。
  • 使用不同的迭代器方法,例如Makoto帖子中指出的findAny
  • 完全用普通循环替换匿名方法。