Java 8 Optional 和 flatMap - 有什么问题吗?

标签 java map java-8 option-type 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());
    }
}

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

我的目标是:

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

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

最佳答案

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

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

PlayerList 到 Player 名称 StringList 的映射不能是由 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());

关于Java 8 Optional 和 flatMap - 有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26252779/

相关文章:

java - 对长类型检测的疑问

java - Spring Boot 控制台应用程序 :Invocation of init method failed; nested exception is java. lang.NoClassDefFoundError: javax/transaction/SystemException

grails - 在Grails中为 map 值建模的最佳方法?

java - 如何将以下代码转换为 Java 8 流和 lambda

java - 读取 JAR 文件外部的属性文件 - java 8 无法识别文件

java - 无法 Autowiring javamailSender

java - 如何仅更改一个字段来创建多个 xml 请求?

java - 当java类X需要放入名为X.java的文件中时?

http - 通过 http 请求打开街道 map 图 block

java - 使用 lambda 获取 Map<K,V> 的最大键