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
      • 将匿名方法完全替换为普通循环

      @Tim:这怎么会是一个重复?我不认为这真的是一个“精确的重复”:它不是像其他问题那样要求在循环外设置变量。这个问题可以通过在循环外部添加要从循环内部修改的变量来解决,但这有点尴尬,并不是最好的解决方案。在这种情况下,使用类似
      stringList.stream().findFirst(…)
      的内容比使用
      forEach
      更简单。@TimBiegeleisen-您提供的答案不适合这个问题。这个问题的正确答案不在其中。你想在这里做什么?您已经知道字符串的值为
      “s1”
      ,那么为什么需要使用如此复杂的逻辑来确定它呢?请注意
      返回项
      试图从lambda表达式返回,而不是从
      getString()
      方法返回。@Tim:这怎么是重复的?我不认为这是真正的“完全重复”:它不是像其他问题那样询问在循环外设置变量。这个问题可以通过在循环外部添加要从循环内部修改的变量来解决,但这有点尴尬,并不是最好的解决方案。在这种情况下,使用类似
      stringList.stream().findFirst(…)
      的内容比使用
      forEach
      更简单。@TimBiegeleisen-您提供的答案不适合这个问题。这个问题的正确答案不在其中。你想在这里做什么?您已经知道字符串的值为
      “s1”
      ,那么为什么需要使用如此复杂的逻辑来确定它呢?请注意
      返回项
      试图从lambda表达式返回,而不是从
      getString()
      方法返回。不过,这是lambda的事实与实际错误无关。哟