使用Java 8流处理地图列表

用户3892260:

如何将这段代码简化为单个lambda表达式?想法是有一个地图列表,我想使用键上的过滤器来创建一个新的地图列表。在此示例中,我想重新映射它,以便仅保留键“ x”和“ z”。

    Map<String, String> m0 = new LinkedHashMap<>();
    m0.put("x", "123");
    m0.put("y", "456");
    m0.put("z", "789");

    Map<String, String> m1 = new LinkedHashMap<>();
    m1.put("x", "000");
    m1.put("y", "111");
    m1.put("z", "222");

    List<Map> l = new ArrayList<>(Arrays.asList(m0, m1));
    List<Map> tx = new ArrayList<>();
    for(Map<String, String> m : l) {
        Map<String, String> filtered = m.entrySet()
                .stream()
                .filter(map -> map.getKey().equals("x") || map.getKey().equals("z"))
                .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
        tx.add(filtered);
    }
    System.err.println("l: " + l);
    System.err.println("tx: " + tx);

输出:

    l: [{x=123, y=456, z=789}, {x=000, y=111, z=222}]
    tx: [{x=123, z=789}, {x=000, z=222}]
霍尔格:

当然,您可以将整个操作转换为一个Stream操作。

// no need to copy a List (result of Array.asList) to an ArrayList, by the way
List<Map<String, String>> l = Arrays.asList(m0, m1);

List<Map<String, String>> tx = l.stream().map(m -> m.entrySet().stream()
        .filter(map -> map.getKey().equals("x") || map.getKey().equals("z"))
        .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue())))
    .collect(Collectors.toList());

但请注意,通过a进行流式传输Map和过滤是一项具有线性时间复杂度的操作,因为它会根据过滤器检查每个映射的每个键,而您只需要保留很少的实际键。因此,这里使用起来更简单,更有效(对于较大的地图)

List<Map<String, String>> tx = l.stream()
    .map(m -> Stream.of("x", "y")
                    .filter(m::containsKey).collect(Collectors.toMap(key->key, m::get)))
    .collect(Collectors.toList());

每个地图只会执行四个查询。如果麻烦您,您甚至可以将其减少为两次查找,但是,常数因数与总体时间复杂度无关,如果地图具有恒定的时间查找,则总时间复杂度将是恒定的时间,例如HashMap即使对于具有O(log(n))查找时间复杂度TreeMap的映射(例如),如果映射大于示例代码的三个映射,这也将比线性扫描更有效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java 8流-合并地图列表

使用 Java 8 流使用地图列表构建新地图

使用Java 8流分组通过在地图列表列表上吗?

如何使用Java 8流从地图列表中找到每个用户的最低分数

使用Java流从列表创建地图列表

Java流-从地图列表中获取地图

Java 8-如何使用流收集器对地图列表进行分组和求和

我如何排序使用Java 8的地图列表?

Java流将要设置的地图列表转换

使用流从地图列表中检索值

如何使用Java 8流和Lambda迭代和处理其值是元素列表的地图的值

在Java 8中按地图列表分组

使用Java 8流迭代地图的地图内的列表

Java 8流收集项目列表的地图

使用Java 8从地图列表中为某些键值创建arraylist

如何通过使用Java 8流列表过滤地图?

如何通过java中的流获取地图列表值的大小

Java8-如何将嵌套地图转换为通过内部地图的键值收集的嵌套地图列表

Java从地图列表中删除元素

从Java 8的地图列表中获取字符串

如何使用Java 8通过某些特定键的值对地图列表进行排序?

如何将此包装的地图列表扁平化为另一种地图Java 8?

如何压平列表的嵌套地图与Java 8个流?

收集列表<对象>地图<字符串,列表<对象>>中的Java 8中使用流

在Java中将地图映射转换为地图列表

使用Java Streams从地图列表中拉出密钥,并创建地图地图

使用 for 循环从地图列表中检索地图

使用Java Streams将地图列表转换为列表地图

转换列表对象为使用Java 8个流对象的自定义地图