我有两个收藏品如下所示:
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 })我尝试创建一个将列表转换为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));
}
}但是,此函数将需要将此条目列表转换为映射。
请建议以哪种方式可以简化?
发布于 2015-09-23 11:23:30
如果使用的是Java 8,则可以执行以下操作:
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,您可以使用Maps.asMap,因为Guava 14.0:
Map<String, Boolean> map = Maps.asMap(
attributes, Functions.forPredicate(Predicates.in(activeAttributes)));请注意,这将返回一个活动副本(对集合的任何更改都将反映在地图上)。如果您想要一个不变的地图,请使用Maps.toMap。
https://stackoverflow.com/questions/32738153
复制相似问题