【问题标题】:Java 8 Optional and flatMap - what is wrong?Java 8 Optional 和 flatMap - 有什么问题?
【发布时间】:2014-12-02 20:53:01
【问题描述】:

一段代码:

public class Player {
    Team team;
    String name;
}

public class Team {
    List<Player> players;
}

public class Demo {

    @Inject
    TeamDAO teamDAO;

    @Inject
    PlayerDAO playerDAO;

    List<String> findTeamMatesNames(String playerName) {
        Optional<Player> player = Optional.ofNullable(playerDAO.get(playerName));

        return player.flatMap(p -> teamDAO.findPlayers(p.team))
            .map(p -> p.name)
            .orElse(Collections.emptyList());
    }
}

为什么我不能这样做?在 flatMap 方法中,我收到错误“类型不匹配:无法从列表转换为可选”

我的目标是:

  1. 如果存在 optional 我想根据这个可选对象属性获取项目列表

  2. 如果 optional 不存在,我想返回空列表

【问题讨论】:

  • 你得到什么错误?
  • 你得到什么错误? teamDAO.finPlayers 是什么?
  • findTeamMatesNames中的team从何而来?
  • 这不是你要的重点。在 flatMap 我得到:“类型不匹配:无法从 List 转换为 Optional
  • @coolcfan 他的代码被破坏了,团队应该是玩家。

标签: java map java-8 optional flatmap


【解决方案1】:

您可以使用map 来执行所需的操作。如果Optional 为空,map 操作将不会发生,但又会留下一个空的Optional。您可以在之后提供后备值:

player.map(p -> teamDAO.findPlayers(p.team)).orElse(Collections.emptyList())

PlayerList 到玩家名称Strings 的List 的映射不能由Optional 执行;这是Stream 任务:

Optional<Player> player = Optional.ofNullable(playerDAO.get(playerName));
return player.map(p -> teamDAO.findPlayers(p.team)
                           .stream().map(tp -> tp.name).collect(Collectors.toList()))
             .orElse(Collections.emptyList());

【讨论】:

  • 我没有说我必须在第一个 map 函数中执行下一个操作。谢谢!
  • @dmydlarz:之后也可以这样做,例如player.map(p -&gt; teamDAO.findPlayers(p.team)).orElse(Collections.emptyList()) .stream().map(tp -&gt; tp.name).collect(Collectors.toList()) 具有相同的语义,但如果Optional 为空,则意味着对空流执行不必要的收集操作。
猜你喜欢
  • 2014-05-08
  • 2014-12-28
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 2019-05-11
  • 2018-06-02
  • 2018-01-13
相关资源
最近更新 更多