小编pro*_*cke的帖子

是否可以在使用 java 8 流的收集阶段过滤/忽略对象?

这个问题与我不久前发布的另一个问题有关。

我已经找到了一种按照我想要的方式对数据进行分组的方法。但是因为我需要对对象进行分组/映射,所以当我需要应用一些过滤时,我已经在收集期间关闭了流。我有以下代码:

final Map<TeamDetails, List<Player>> teamDetailsPlayerListMap  = 
        dbRows.stream().map(row -> mapDbRowToTeamPlayerPair(row))
                .collect(Collectors.groupingBy(TeamPlayerPair::getKey, 
                      Collectors.mapping(TeamPlayerPair::getValue, Collectors.toList())));

final List<Team> teams = teamDetailsPlayerListMap.entrySet().stream()
        .map(teamPlayerList -> mapTeamPlayerListToTeam(teamPlayerList))
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是某些 dbRowsStringplayerName. 我不想在收集之前过滤,就好像 aTeam没有播放器一样(例如,只有 1 db 行,播放器名称为空字符串),我仍然希望Team在最后的s列表中包含它。它只会有一个空的玩家列表。

有什么方法可以在收集过程中应用过滤器,以便不会将空字符串或空字符串添加到列表中???

我已经能够使用自定义收集器实现它,如下所示,但我只是想知道是否有办法在没有自定义收集器的情况下做到这一点???

Function<Player, Boolean> emptyPlayerNameFilter = new Function<Player, Boolean>() {
    @Override
    public Boolean apply(Player player) {
         return player != null && player.getName() != null && !"".equals(player.getName());
    }
};

final Map<TeamDetails, List<Player>> teamDetailsPlayerListMap  = 
        dbRows.stream().map(row -> mapDbRowToTeamPlayerPair(row))
        .collect(Collectors.groupingBy(TeamPlayerPair::getKey, 
                Collectors.mapping(TeamPlayerPair::getValue, 
                        MyCollectors.toFilteredLinkedList(emptyPlayerNameFilter))));

final List<Team> …
Run Code Online (Sandbox Code Playgroud)

java-8 java-stream collectors

2
推荐指数
1
解决办法
2012
查看次数

标签 统计

collectors ×1

java-8 ×1

java-stream ×1