当前位置: 首页 > 知识库问答 >
问题:

从Java的lambda forEach()返回

郁宾鸿
2023-03-14

我试图将一些for-each循环更改为lambdaforeach()-方法,以发现lambda表达式的可能性。以下似乎是可能的:

ArrayList<Player> playersOfTeam = new ArrayList<Player>();      
for (Player player : players) {
    if (player.getTeam().equals(teamName)) {
        playersOfTeam.add(player);
    }
}

使用lambdaforeach()

players.forEach(player->{if (player.getTeam().equals(teamName)) {playersOfTeam.add(player);}});

但下一个就不起作用了:

for (Player player : players) {
    if (player.getName().contains(name)) {
        return player;
    }
}

带lambda

players.forEach(player->{if (player.getName().contains(name)) {return player;}});

是最后一行的语法有问题还是无法从foreach()方法返回?

共有1个答案

那弘
2023-03-14

这里的return是从lambda表达式返回的,而不是从包含的方法返回的。您需要foreach而不是filter流:

players.stream().filter(player -> player.getName().contains(name))
       .findFirst().orElse(null);

在这里,filter将流限制为与谓词匹配的那些项,findfirst然后返回具有第一个匹配项的optional

这看起来比for-loop方法效率低,但实际上findfirst()可能会短路--它不会生成整个过滤后的流,然后从中提取一个元素,而是只过滤需要的元素,以便找到第一个匹配的元素。如果您不需要从(排序的)流中获取第一个匹配的播放器,而只需要获取任何匹配的项,那么您也可以使用findany()而不是findfirst()。当涉及并行时,这允许更好的效率。

 类似资料:
  • 问题内容: 近我很惊讶地发现,在Java的finally块中可能有一个return语句。 似乎很多人都认为这是一件坏事,如“ 不要在finally子句中返回”中所述。更深入地研究,我还发现“ Java的回报并不总是 ”,这在finally块中显示了其他类型的流控制的一些非常可怕的示例。 因此,我的问题是,谁能给我一个示例,其中finally块中的return语句(或其他流控制)产生更好/更具可读性

  • 问题内容: 我试图将一些for-each循环更改为lambda- 方法,以发现lambda表达式的可能性。以下似乎是可能的: 带lambda 但是下一个无效: 带lambda 最后一行的语法是否有问题,或者不可能从方法中返回? 问题答案: 在那里,从λ表达式,而不是从包含方法返回。而不需要流: 这里将流限制为与谓词匹配的那些项,然后返回带有第一个匹配条目的。 这看起来不如for循环方法有效,但实际

  • 问题内容: 问题答案: 有很多原因不回来。 但这通常归结为以下事实:执行的命令不会退出。 同样,这可能有很多原因。 一个普遍的原因是该过程产生了一些输出,而你没有从适当的流中读取。这意味着一旦缓冲区已满,进程就会被阻塞,并等待你的进程继续读取。你的进程依次等待另一个进程完成(之所以不会,是因为它等待你的进程,…)。这是一个典型的僵局情况。 你需要不断从流程输入流中读取内容,以确保它不会被阻塞。

  • 我尝试了一些变体,但没有运气返回GraphQL中的地图。因此,我有以下两个对象: 我的模式如下: 有人能告诉我如何实现这一点,以便GraphQL神奇地处理这一点或另一种方法。 非常感谢!

  • 问题内容: 我有这个代码。 每个值的名称产生,我希望协会指定的具有指定在。 为了支持 类 类 现在的问题是,是否有可能返回一个排序从直接? (没有先前创建的内容,后来又放置了) 问题答案: 这对您有用吗? 我想我终于明白了。我不得不重新整理方法之类的。 更新。我添加了排序并以

  • 问题内容: 我有一个方法。值在内部被更改,我想将其返回给该方法。有没有办法做到这一点? 问题答案: 可以使用局部最终变量数组。该变量必须是非基本类型,因此可以使用数组。你还需要同步两个线程,例如使用CountDownLatch: 你也可以这样使用an Executor和a Callable: