Java8-流、筛选器和可选

Java8-流、筛选器和可选,java,java-8,java-stream,optional,Java,Java 8,Java Stream,Optional,我有以下代码 public Player findPlayerByUsername(String username) { return players.stream().filter(p -> p.getUsername().equalsIgnoreCase(username)) .findFirst().get(); } 问题是,我希望它返回null如果不存在值,我将如何执行该操作?因为就目前而言,这只是抛出了一个NoTouchElement

我有以下代码

public Player findPlayerByUsername(String username) {
    return players.stream().filter(p -> p.getUsername().equalsIgnoreCase(username))
                  .findFirst().get();
}
问题是,我希望它返回
null
如果不存在值,我将如何执行该操作?因为就目前而言,这只是抛出了一个
NoTouchElementException

public Player findPlayerByUsername(final String username) {
   return players.stream().filter(p -> p.getUsername().equalsIgnoreCase(username)).findFirst().orElse(null);
}
findFirst()
方法返回一个
可选的

如果optional有player对象,
optional.get()
将返回该对象。如果对象不存在,并且您需要一些替代方案,请在中提供该选项

.orElse(new Player()); or .orElse(null) 

有关更多详细信息,请参见和

我在想,应该详细说明,是否可以在一行中完成此操作?是的,让我详细说明这是对“Optional.findFirst()”的滥用。我们的想法是使用“findFirst()”返回的“Optional”,而不是返回null,然后检查播放器是否为null。@FedericoPeraltaSchaffner我不同意
。orElse(null)
是一种误用。它肯定会被过度使用,但它有合法的用途——它是
Optional.ofNullable()
的对偶,两者构成了可空世界和可选世界之间的网关对。@federicoperataschaffner我想说
orElse(null)
是一种代码气味。它不一定是错误的,但是它可能(经常)表示需要改进的东西。使用可选的全部要点是避免使用<代码> null <代码>。