【问题标题】:Convert Collection to Map将集合转换为地图
【发布时间】:2015-09-23 11:18:36
【问题描述】:

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

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 集合的 Guava 函数:

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));
    }
}

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

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

【问题讨论】:

  • 你不想使用标准的“for”循环?

标签: java java-7 guava


【解决方案1】:

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

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

【讨论】:

  • Tunaki:感谢您的回答,但不幸的是我们使用的是 java 7。将更新标签。
  • 非常感谢!
  • 您可以将s -&gt; activeAttributes.contains(s) 替换为activeAttributes::contains。您也可以将s -&gt; s 替换为Function.identity(),尽管这样不太好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2013-09-19
  • 1970-01-01
相关资源
最近更新 更多