【问题标题】:Java 8 - Stream, filter and optionalJava 8 - 流、过滤器和可选
【发布时间】:2016-02-07 03:55:59
【问题描述】:

我有以下代码

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

问题是,如果不存在任何值,我希望它返回 null,我该怎么做呢?因为就目前而言,这只会引发NoSuchElementException

【问题讨论】:

  • 使用 Optional 的全部意义在于避免使用 null 您应该考虑返回 Optional<Player>

标签: java java-8 java-stream optional


【解决方案1】:
public Player findPlayerByUsername(final String username) {
   return players.stream().filter(p -> p.getUsername().equalsIgnoreCase(username)).findFirst().orElse(null);
}

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

如果 optional 有玩家对象,optional.get() 将返回该对象。如果对象不存在并且您想要一些替代方案,请在

中给出该选项
.orElse(new Player()); or .orElse(null) 

更多详情见Optional DocumentationOptional tutorial

【讨论】:

  • 我在想,应该详细说明一下,是否可以在 1 行中做到这一点?
  • 是的,让我详细说明
  • 这是对“Optional.findFirst()”的误用。这个想法是使用 'findFirst()' 返回的 'Optional' 而不是返回 null 然后检查播放器是否为 null。
  • @FedericoPeraltaSchaffner 我不同意.orElse(null) 是一种误用。它当然可以过度使用,但它有合法用途——它是Optional.ofNullable() 的对偶,两者形成可空世界和可选世界之间的网关对。
  • @FedericoPeraltaSchaffner 我会说orElse(null) 是一种代码气味。这不一定是错误的,但它可能(经常?)表明需要改进。
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2015-01-02
相关资源
最近更新 更多