首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将集合转换为地图

将集合转换为地图
EN

Stack Overflow用户
提问于 2015-09-23 11:18:36
回答 1查看 6.1K关注 0票数 2

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

代码语言:javascript
复制
Set<String> attributes = Sets.newHashSet("aaa", "bbb", "ccc", "ddd");
Set<String> activeAttributes = Sets.newHashSet("eee", "lll", "ccc", "mmm");

将这些集合转换为映射的想法,考虑到attributes集合应用作此映射的键,并且在计算值时应使用activeAttributes (如果activeAttributes包含来自集合attributes的值,则为"true",否则应设置"false“参数):

例如:

代码语言:javascript
复制
({aaa -> false, bbb -> false, ccc -> true, ddd -> false })

我尝试创建一个将列表转换为Map.Entry集合的番石榴函数:

代码语言:javascript
复制
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));
    }
}

但是,此函数将需要将此条目列表转换为映射。

请建议以哪种方式可以简化?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-23 11:23:30

如果使用的是Java 8,则可以执行以下操作:

代码语言:javascript
复制
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:

代码语言:javascript
复制
Map<String, Boolean> map = Maps.asMap(
    attributes, Functions.forPredicate(Predicates.in(activeAttributes)));

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32738153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档