Java Void方法在尝试返回forEach方法中的某些内容时无法返回值错误
我有一个Java Void方法在尝试返回forEach方法中的某些内容时无法返回值错误,java,Java,我有一个片段,如下所示 private String getString() { List<String> stringList = Arrays.asList("s1", "s2"); stringList.forEach(item -> { if (item.equals("s1")) return item; }); return null; } privat
片段
,如下所示
private String getString() {
List<String> stringList = Arrays.asList("s1", "s2");
stringList.forEach(item ->
{
if (item.equals("s1"))
return item;
});
return null;
}
private String getString(){
List stringList=Arrays.asList(“s1”、“s2”);
stringList.forEach(项目->
{
如果(项目等于(“s1”))
退货项目;
});
返回null;
}
现在,当我尝试
返回项
时,我得到了一个编译错误Void方法无法返回值
。我在谷歌上搜索,不明白为什么会发生这种情况,以及这个问题的解决方案。如何在上述forEach
循环中返回项目
。forEach
是一个消费过程。传递给forEach
方法的函数预期会产生副作用,不会直接导致返回值,例如打印列表的内容或执行一些副操作
基本上,任何消费者
函数或返回无效
的方法在这里都是公平的游戏
因为您显式地寻找一个值,所以可以使用
//不管怎样,你都不会对你想要的结果做任何事情,
//所以我只是把它打印出来。你应该决定你需要做什么
//带着你得到的价值。
可选的findResult=stringList().stream().findAny(v->v.equals(“s1”);
findResult.ifPresent(系统输出::println);
forEach
是一个消费过程。传递给forEach
方法的函数预期会产生副作用,不会直接导致返回值,例如打印列表的内容或执行一些副操作
基本上,任何消费者
函数或返回无效
的方法在这里都是公平的游戏
因为您显式地寻找一个值,所以可以使用
//不管怎样,你都不会对你想要的结果做任何事情,
//所以我只是把它打印出来。你应该决定你需要做什么
//带着你得到的价值。
可选的findResult=stringList().stream().findAny(v->v.equals(“s1”);
findResult.ifPresent(系统输出::println);
我想你误解了兰博达斯。lambda是可立即执行或延迟执行的可执行语句;更重要的是,它有自己的方法签名
在下面的代码中,您定义了一个匿名方法。它的签名是什么
stringList.forEach(item ->
{
if (item.equals("s1"))
return item;
});
答案是匿名方法具有以下等效表示形式:
private void myAnonymousMethod( String item ) {
if ( item.equals("s1"))
return item;
}
你现在明白你的错误了吗?您的匿名方法有一个void
返回类型,但您试图返回一个值
相反,您可以通过多种方式解决此问题:
- 找到要查找的值后,将其保存在lambda范围之外的局部变量中。Pro:对代码进行最小的更改。缺点:foreach循环在找到第一个匹配项后将继续执行
- 使用不同的迭代器方法,如Makoto的帖子中指出的
findAny
- 将匿名方法完全替换为普通循环
- 我想你误解了兰博达斯。lambda是可立即执行或延迟执行的可执行语句;更重要的是,它有自己的方法签名
在下面的代码中,您定义了一个匿名方法。它的签名是什么
stringList.forEach(item ->
{
if (item.equals("s1"))
return item;
});
答案是匿名方法具有以下等效表示形式:
private void myAnonymousMethod( String item ) {
if ( item.equals("s1"))
return item;
}
你现在明白你的错误了吗?您的匿名方法有一个void
返回类型,但您试图返回一个值
相反,您可以通过多种方式解决此问题:
- 找到要查找的值后,将其保存在lambda范围之外的局部变量中。Pro:对代码进行最小的更改。缺点:foreach循环在找到第一个匹配项后将继续执行
- 使用不同的迭代器方法,如Makoto的帖子中指出的
findAny
- 将匿名方法完全替换为普通循环
stringList.stream().findFirst(…)
的内容比使用forEach
更简单。@TimBiegeleisen-您提供的答案不适合这个问题。这个问题的正确答案不在其中。你想在这里做什么?您已经知道字符串的值为“s1”
,那么为什么需要使用如此复杂的逻辑来确定它呢?请注意返回项
试图从lambda表达式返回,而不是从getString()
方法返回。@Tim:这怎么是重复的?我不认为这是真正的“完全重复”:它不是像其他问题那样询问在循环外设置变量。这个问题可以通过在循环外部添加要从循环内部修改的变量来解决,但这有点尴尬,并不是最好的解决方案。在这种情况下,使用类似stringList.stream().findFirst(…)
的内容比使用forEach
更简单。@TimBiegeleisen-您提供的答案不适合这个问题。这个问题的正确答案不在其中。你想在这里做什么?您已经知道字符串的值为“s1”
,那么为什么需要使用如此复杂的逻辑来确定它呢?请注意返回项
试图从lambda表达式返回,而不是从getString()
方法返回。不过,这是lambda的事实与实际错误无关。哟