我有Map<String, Set<String>>
:
{upload=[ADMIN], configure.accounts=[ADMIN, CONSULT], consult=[ADMIN, CONSULT], configure.merchants=[MANAGER, ADMIN], configure.invoices=[MANAGER, ADMIN], graphics=[MANAGER, ADMIN]}
我想获得一个像下一个结构Set<String>
的结构:
[ADMIN, CONSULT, MANAGER]
过滤数据的位置,从地图中的Set中获取所有可能的值。如果我迭代整个Map并比较值,添加那些当前不在Set
中的值,我就可以这样做。
是否有一些功能可以做到这一点?
答案 0 :(得分:3)
Java 8解决方案:
Map<String, Set<String>> test;
Set<String> set = test.values()
.stream()
.flatMap(t->t.stream())
.collect(Collectors.toSet());
无论您使用Java 8还是Java低于8.您的最终目标是接收Set<String>
个元素,因为Set&lt;&gt;中的元素是截然不同的。
通过视频观察。首先,我们迭代集合类型为List的值。然后我们使用flatMap将此Set转换为其元素的Stream。终端操作是在Set中实际收集它们,这将确保我们的元素是不同的。
答案 1 :(得分:2)
您不必检查个别值是否已经在Set
中 - 该集合将负责这一点,这是什么集合。只需迭代值并将它们添加到所有值的集合中。
Map<String, Set<String>> data = new HashMap<>();
data.put("accounts", new HashSet<>(Arrays.asList("ADMIN", "CONSULT")));
data.put("merchants", new HashSet<>(Arrays.asList("MANAGER", "ADMIN")));
Set<String> values = new HashSet<>();
for (Set<String> set : data.values()) {
values.addAll(set);
}
如果您使用的是Java 8,还可以使用for
语句替换foreach
循环:
data.values().forEach(values::addAll);
之后,values
为[MANAGER, ADMIN, CONSULT]
。
答案 2 :(得分:0)
从地图中,您可以使用CASE WHEN weekday = weekday_old THEN NULL ELSE weekday END AS weekday
检索所有集合。那里有一个集合集合。
使用此代码,您可以获得所有独特的集合
map.values()