gpt4 book ai didi

java - 使用 Java 8 流处理 map 列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:41:50 25 4
gpt4 key购买 nike

如何将此代码简化为单个 lambda 表达式?这个想法是有一个 map 列表,我想创建一个新的 map 列表,使用键上的过滤器。在这个例子中,我想重新映射它,以便它只保留键“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());

但请注意,通过 Map 进行流式传输和过滤是一种具有线性时间复杂度的操作,因为它会根据过滤器检查每个 map 的每个键,而您只有很少的您要保留的实际 key 。所以在这里,使用起来更加简单和高效(对于更大的 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());

每张 map 只会执行四次查找。如果它困扰你,你甚至可以将它减少到两次查找,但是,常数因子与整体时间复杂度无关,如果 map 具有恒定时间查找,则整体时间复杂度将是恒定时间,如 HashMap。即使对于具有 O(log(n)) 查找时间复杂度的 map ,如 TreeMap,如果 map 大于三个,这将比线性扫描更有效示例代码的映射。

关于java - 使用 Java 8 流处理 map 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43268689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com