【发布时间】:2021-07-01 09:53:55
【问题描述】:
我有一个地图数据结构列表。我需要通过在每个地图中搜索一个值来过滤列表(结果总是只有一个地图)。下面的代码显示了我执行此操作的两种方法。虽然我的 Lambda 方法有效,但对我来说似乎很臃肿。我觉得我在这里遗漏了一些简单的东西,并且有一个更简洁的 Lambda 可以用来代替这个。我将不胜感激任何使 Lambda 变得更好的建议。非常感谢。
package test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Temp {
public static void main(String[] args) {
Map<String, String> map1 = new HashMap<>();
map1.put("map1-key1", "map1-value-1");
map1.put("map1-key2", "map1-value-2");
map1.put("map1-key3", "map1-value-3");
Map<String, String> map2 = new HashMap<>();
map2.put("map2-key1", "map2-value-1");
map2.put("map2-key2", "some_wanted_value");
map2.put("map2-key3", "map2-value-3");
Map<String, String> map3 = new HashMap<>();
map3.put("map3-key1", "map3-value-1");
map3.put("map3-key2", "map3-value-2");
map3.put("map3-key3", "map3-value-3");
List<Map<String, String>> LOMs = new ArrayList<>();
LOMs.add(map1);
LOMs.add(map2);
LOMs.add(map3);
String column = "some_wanted_value";
// Imperative method.
Map<String, String> x = new HashMap<>();
for(Map<String, String> lom : LOMs) {
if(lom.containsValue(column)) {
x = lom;
break;
}
}
x.forEach((k,v) -> System.out.println(k + "->" + v));
/*
map2-key1->map2-value-1
map2-key3->map2-value-3
map2-key2->some_wanted_value
*/
// Lambda method.
Map<String, String> y = LOMs
.stream()
.filter(s -> s.containsValue(column))
.flatMap(s -> s.entrySet().stream())
.map(s -> s.toString().split("="))
.collect(Collectors.toMap(s -> s[0], s -> s[1], (o, n) -> o));
y.forEach((k,v) -> System.out.println(k + "->" + v));
/*
map2-key1->map2-value-1
map2-key3->map2-value-3
map2-key2->some_wanted_value
*/
}
}
【问题讨论】:
标签: java list java-stream maps