我有一个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
?
答案 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
返回类型,但您尝试返回值。
相反,您可以通过多种方式解决此问题:
findAny
。