Java 将集合转换为地图

Java 将集合转换为地图,java,java-7,guava,Java,Java 7,Guava,我有两个收藏,如下所示: Set<String> attributes = Sets.newHashSet("aaa", "bbb", "ccc", "ddd"); Set<String> activeAttributes = Sets.newHashSet("eee", "lll", "ccc", "mmm"); 我尝试创建一个番石榴函数,将列表转换为地图集合。条目: private static class ActiveAttributesFunction impl

我有两个收藏,如下所示:

Set<String> attributes = Sets.newHashSet("aaa", "bbb", "ccc", "ddd");
Set<String> activeAttributes = Sets.newHashSet("eee", "lll", "ccc", "mmm");
我尝试创建一个番石榴函数,将列表转换为地图集合。条目:

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));
    }
}
私有静态类ActiveAttributesFunction实现函数{
私有属性集;
公共activeAttributes函数(设置activeAttributes){
this.activeAttributes=activeAttributes;
}
@凌驾
公共映射。条目应用(字符串输入){
返回Maps.immutableEntry(输入,activeAttributes.contains(输入));
}
}
但是,此函数需要将此条目列表转换为映射


请建议以何种方式简化此操作?

如果您使用的是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);

请注意,这将返回一个实时副本(对集合的任何更改都将反映在地图上)。如果您想要一个不可变的映射,请使用。

Tunaki:谢谢您的回答,但不幸的是,我们使用的是java 7。将更新标签。非常感谢!您可以将
s->activeAttributes.contains
替换为
activeAttributes::contains
。您还可以用
Function.identity()
替换
s->s
,尽管这不是很整洁。您不想使用标准的“for”循环吗?
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);
Map<String, Boolean> map = Maps.asMap(
    attributes, Functions.forPredicate(Predicates.in(activeAttributes)));