Java 8 - Stream,过滤器和可选项

4
我有以下代码
public Player findPlayerByUsername(String username) {
    return players.stream().filter(p -> p.getUsername().equalsIgnoreCase(username))
                  .findFirst().get();
}

问题是,如果没有值存在,我希望它返回null,我该怎么做?因为现在的情况是,它只会抛出NoSuchElementException

3
使用Optional的整个重点是避免使用null,你应该考虑返回Optional<Player>而不是直接返回null - Peter Lawrey
1个回答

11
public Player findPlayerByUsername(final String username) {
   return players.stream().filter(p -> p.getUsername().equalsIgnoreCase(username)).findFirst().orElse(null);
}
findFirst()方法返回一个Optional<Player>对象。

如果Optional存在Player对象,optional.get()将返回该对象。如果对象不存在且您想要一些替代选项,请在中提供该选项。

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

更多详情请参阅Optional DocumentationOptional tutorial


我在想,应该详细说明一下,这个能不能用一行代码实现? - ImTomRS
1
是的,让我详细说明一下。 - Noor Nawaz
1
这是对 ´Optional.findFirst()´ 方法的误用。正确的使用方法应该是使用 'findFirst()' 返回的 'Optional' 对象,而不是返回 null 然后再检查 player 是否为 null。 - fps
6
我不同意 .orElse(null) 是误用。它确实可以被滥用,但它有合法的用途--它是 Optional.ofNullable() 的对偶,两者共同形成了从可为空的世界到可选世界的网关对。 - Brian Goetz
@BrianGoetz 这么说来,你是完全正确的。 “误用”这个词有点太严厉了。我的观点就像你所说的那样,它被过度使用了很多次,即在findFirst()之后的代码中,有许多if语句检查可选项返回的值是否为!= null以执行某些代码块,而使用ifPresent(consumer)会更方便。 - fps
2
@FedericoPeraltaSchaffner 我会说 orElse(null) 是一种 代码异味。它不一定是错误的,但它可能(经常?)表明需要改进某些东西。 - Stuart Marks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接