将集合转换为地图
Convert Collection to Map
我有如下两个合集:
Set<String> attributes = Sets.newHashSet("aaa", "bbb", "ccc", "ddd");
Set<String> activeAttributes = Sets.newHashSet("eee", "lll", "ccc", "mmm");
将这些集合转换为映射的想法,假设 attributes
集合应该用作此映射的键,并且 activeAttributes
应该在计算值时使用(如果 activeAttributes
包含来自集合 attributes
然后 "true" 的值,否则应设置 "false" 参数):
例如:
({aaa -> false, bbb -> false, ccc -> true, ddd -> false })
我尝试创建一个 Guava 函数,将列表转换为 Map.Entry 的集合:
private static class ActiveAttributesFunction implements Function<String, Map.Entry<String, Boolean>> {
private Set<String> activeAttributes;
public ActiveAttributesFunction (Set<String> activeAttributes) {
this.activeAttributes = activeAttributes;
}
@Override
public Map.Entry<String, Boolean> apply(String input) {
return Maps.immutableEntry(input, activeAttributes.contains(input));
}
}
但是,此函数需要将此条目列表转换为映射。
请提出可以简化的方法?
如果您使用的是Java8,您可以执行以下操作:
Set<String> attributes = Sets.newHashSet("aaa", "bbb", "ccc", "ddd");
Set<String> activeAttributes = Sets.newHashSet("eee", "lll", "ccc", "mmm");
Map<String, Boolean> map = attributes.stream().collect(Collectors.toMap(s -> s, activeAttributes::contains));
System.out.println(map);
对于早期版本的 Java 和 Guava,自 Guava 14.0 起您可以使用 Maps.asMap
:
Map<String, Boolean> map = Maps.asMap(
attributes, Functions.forPredicate(Predicates.in(activeAttributes)));
请注意,此 returns 是一个实时副本(对集合的任何更改都会反映在地图上)。如果你想要一个不可变的地图,使用 Maps.toMap
.
我有如下两个合集:
Set<String> attributes = Sets.newHashSet("aaa", "bbb", "ccc", "ddd");
Set<String> activeAttributes = Sets.newHashSet("eee", "lll", "ccc", "mmm");
将这些集合转换为映射的想法,假设 attributes
集合应该用作此映射的键,并且 activeAttributes
应该在计算值时使用(如果 activeAttributes
包含来自集合 attributes
然后 "true" 的值,否则应设置 "false" 参数):
例如:
({aaa -> false, bbb -> false, ccc -> true, ddd -> false })
我尝试创建一个 Guava 函数,将列表转换为 Map.Entry 的集合:
private static class ActiveAttributesFunction implements Function<String, Map.Entry<String, Boolean>> {
private Set<String> activeAttributes;
public ActiveAttributesFunction (Set<String> activeAttributes) {
this.activeAttributes = activeAttributes;
}
@Override
public Map.Entry<String, Boolean> apply(String input) {
return Maps.immutableEntry(input, activeAttributes.contains(input));
}
}
但是,此函数需要将此条目列表转换为映射。
请提出可以简化的方法?
如果您使用的是Java8,您可以执行以下操作:
Set<String> attributes = Sets.newHashSet("aaa", "bbb", "ccc", "ddd");
Set<String> activeAttributes = Sets.newHashSet("eee", "lll", "ccc", "mmm");
Map<String, Boolean> map = attributes.stream().collect(Collectors.toMap(s -> s, activeAttributes::contains));
System.out.println(map);
对于早期版本的 Java 和 Guava,自 Guava 14.0 起您可以使用 Maps.asMap
:
Map<String, Boolean> map = Maps.asMap(
attributes, Functions.forPredicate(Predicates.in(activeAttributes)));
请注意,此 returns 是一个实时副本(对集合的任何更改都会反映在地图上)。如果你想要一个不可变的地图,使用 Maps.toMap
.