当前位置: 首页 > 面试题库 >

从Java中的lambda forEach()返回

杜起运
2023-03-14
问题内容

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

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

带lambda forEach()

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()方法中返回?


问题答案:

return那里,从λ表达式,而不是从包含方法返回。而不forEach需要filter流:

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

这里filter将流限制为与谓词匹配的那些项,findFirst然后返回Optional带有第一个匹配条目的。

这看起来不如for循环方法有效,但实际上findFirst()会短路-
它不会生成整个过滤后的流,然后从中提取一个元素,而是仅过滤所需数量的元素,以便找到第一个匹配的。你也可以使用findAny(),而不是findFirst()如果你不一定在乎获得
第一个 从(订购)流,但只是任何匹配项匹配的球员。当涉及并行时,这可以提高效率。



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

  • 问题内容: 我刚刚开始使用Java 8,并且想知道是否有一种方法可以编写返回a的方法。 现在我有如下方法: 有没有一种方法可以更简洁地用Java 8编写代码?我希望这可以工作,但不能: 问题答案: 摆脱函数定义内的return语句:

  • 我有一个函数,可以从文件列表中创建一个Zip文件。是否可以在不保存在磁盘上的情况下返回Zip文件?我需要这个文件,因为我必须使用zip文件作为另一个函数的参数。我不确定ByteStream是否适合我。 编辑:添加用例 其想法是创建一个zip文件,并使用Watson的VisualRecognition服务的CreateClassifications方法。 构建器接受zip文件作为参数。 理解 根据A

  • 我试图将一些for-each循环更改为lambda-方法,以发现lambda表达式的可能性。以下似乎是可能的: 使用lambda 但下一个就不起作用了: 带lambda 是最后一行的语法有问题还是无法从方法返回?

  • 问题内容: 在android中,我正在创建用于url连接的线程。在线程中,我将响应消息存储在全局声明的字符串中。当我访问method方法时,它返回null。 当我调用该方法时,它返回null。 问题答案: 您真的只想使用它,尝试一下

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