Java 8可选和flatMap - 出了什么问题?

Dar*_*arz 4 java map optional java-8 flatmap

一些代码:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我的目标是:

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

  2. 如果不存在可选项,我想返回空列表

Hol*_*ger 9

您可以使用它map来执行所需的操作.该map操作将不会发生,如果Optional是空的,但再次离开空Optional.您可以在以后提供后备值:

player.map(p -> teamDAO.findPlayers(p.team)).orElse(Collections.emptyList())
Run Code Online (Sandbox Code Playgroud)

从映射ListPlayer一个List球员的名字Strings不能由执行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());
Run Code Online (Sandbox Code Playgroud)