Java 8 - 流,过滤和可选

ImT*_*mRS 4 java optional java-8 java-stream

我有以下代码

public Player findPlayerByUsername(String username) {
    return players.stream().filter(p -> p.getUsername().equalsIgnoreCase(username))
                  .findFirst().get();
}
Run Code Online (Sandbox Code Playgroud)

问题是,null如果没有价值,我希望它返回,我将如何进行呢?因为它的立场,只是抛出一个NoSuchElementException.

Noo*_*waz 11

public Player findPlayerByUsername(final String username) {
   return players.stream().filter(p -> p.getUsername().equalsIgnoreCase(username)).findFirst().orElse(null);
}
Run Code Online (Sandbox Code Playgroud)

findFirst()方法返回一个Optional<Player>.

如果optional具有player对象,optional.get()则返回该对象.如果对象不存在而您想要一些替代方法,请提供该选项

.orElse(new Player()); or .orElse(null) 
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅可选文档可选教程

  • @FedericoPeraltaSchaffner我不同意`.orElse(null)`是滥用.它当然可以被*过度使用*,但它具有合法用途 - 它是`Optional.ofNullable()`的双重选择,其中两者形成可空世界和可选世界之间的网关对. (6认同)
  • @FedericoPeraltaSchaffner我会说`orElse(null)`是*代码气味*.这不一定是错的,但它可能(经常?)表明某些事情需要改进. (2认同)