从地图过滤某些项目 - Java8 StreamAPI

时间:2016-12-07 23:31:36

标签: java java-8 java-stream

我已经按照以下方式对HashMap进行了排序。

map.entrySet()
            .stream()
            .sorted(Map.Entry.comparingByValue(Collections.reverseOrder()))
            .skip(1)
            .limit(50)
            .collect(Collectors.toMap(
                    Map.Entry::getKey,
                    Map.Entry::getValue,
                    (e1, e2) -> e1,
                    LinkedHashMap::new
            ));

我想要做的是从中过滤一些结果,最好使用.filter()。我想要过滤的项目是ArrayList<String> filterUs;

我该怎么做?

假设我在排序操作后有以下结果

{31795=11, 31790=11, 31876=10, 31803=9, 31792=8, 31877=8, 31851=8, 31845=8} 
filterUs = [31790,31876]

我想得到什么:{31795=11, 31803=9, 31792=8, 31877=8, 31851=8, 31845=8, newItem=7, anotherNewItem=6}

3 个答案:

答案 0 :(得分:1)

这看起来很有趣,你在那里设置了一个非常复杂的管道,你不能做过滤器?除非我遗漏了一些东西,否则它非常简单。

Map<Integer, Integer> result = map.entrySet().stream()
            .sorted(Map.Entry.comparingByValue(Collections.reverseOrder()))
            .filter(entry -> !filterUs.contains(entry.getKey()))
            .skip(1)
            .limit(50)
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

答案 1 :(得分:0)

添加

.filter(item -> item.getValue() instanceOf ArrayList)

到流。

结果只包含ArrayList的条目。如果要删除测试,请反转测试(在!之后添加->)。

答案 2 :(得分:0)

要使用它,您可以按照

的方式实现某些功能
map.entrySet()
        .stream()
        .sorted(Map.Entry.comparingByValue(Collections.reverseOrder()))
        .skip(1)
        .filter(entry -> item.getValue() instanceOf ArrayList) // <-- NEW
        .limit(50)
        .collect(Collectors.toMap(
                Map.Entry::getKey,
                Map.Entry::getValue,
                (e1, e2) -> e1,
                LinkedHashMap::new
        ));