收集 HashMap<String, List<String>> java 8

Posted

技术标签:

【中文标题】收集 HashMap<String, List<String>> java 8【英文标题】:collecting HashMap<String, List<String>> java 8 【发布时间】:2014-09-15 00:36:18 【问题描述】:

我希望能够将List 转换为HashMap,其中键是elementName,值是随机列表(在本例中是元素名称)。简而言之,我想要(A-&gt;List(A), B-&gt;List(B), C-&gt; List(C))。我尝试使用toMap() 并将其传递给keyMapperValueMapper,但出现编译错误。如果有人可以帮助我,我将不胜感激。

谢谢!

public static void main(String[] args) 
    // TODO Auto-generated method stub
    List<String> list = Arrays.asList("A","B","C","D");
    Map<String, List<String>> map = list.stream().map((element)->
        Map<String, List<String>> map = new HashMap<>();
        map.put(element, Arrays.asList(element));
        return map;
    ).collect(??);



Function<Map<String, String>, String> key = (map) -> 
    return map.keySet().stream().findFirst().get();
;

Function<Map<String, String>, String> value = (map) -> 
    return map.values().stream().findFirst().get();
;

=== 这对我有用

感谢大家的帮助! @izstas“他们应该对元素进行操作”帮助很大:)。实际上,这正是我想要的准确

public static void test2 ()
    Function<Entry<String, List<String>>, String> key = (entry) -> 
        return entry.getKey();
    ;
    Function<Entry<String, List<String>>, List<String>> value = (entry) -> 
        return new ArrayList<String>(entry.getValue());
    ;
    BinaryOperator<List<String>> merge = (old, latest)->
        old.addAll(latest);
        return old;
    ;

    Map<String, List<String>> map1 = new HashMap<>();
    map1.put("A", Arrays.asList("A1", "A2"));
    map1.put("B", Arrays.asList("B1"));
    map1.put("D", Arrays.asList("D1"));

    Map<String, List<String>> map2 = new HashMap<>();
    map2.put("C", Arrays.asList("C1","C2"));
    map2.put("D", Arrays.asList("D2"));

    Stream<Map<String, List<String>>> stream =Stream.of(map1, map2);
    System.out.println(stream.flatMap((map)->
        return map.entrySet().stream(); 
    ).collect(Collectors.toMap(key, value, merge)));

【问题讨论】:

什么是编译器错误? 发布你的源代码,见How to create a Minimal, Complete, and Verifiable example 我不确定,但据我所知,在您的地图部分中,您从左侧获得的任何内容都必须与右侧匹配,因此我认为您应该返回元素而不是地图 :) 【参考方案1】:

您可以使用groupingBy方法来管理聚合,例如:

public static void main(String[] args) 
    List<String> list = Arrays.asList("A", "B", "C", "D", "A");
    Map<String, List<String>> map = list.stream().collect(Collectors.groupingBy(Function.identity()));

如果您想要更大的灵活性(例如映射值并返回 Set 而不是 List),您始终可以使用 groupingBy 方法和 javadoc 中指定的更多参数:

Map<City, Set<String>> namesByCity = people.stream().collect(Collectors.groupingBy(Person::getCity, mapping(Person::getLastName, toSet())));

【讨论】:

groupingBy 确实存在吗?? 对不起,我修正了这个例子。方法groupingByjava.util.stream.Collectors中的静态方法。 在地图上非常出色>。谢谢!【参考方案2】:

您在代码中定义的函数keyvalue 不正确,因为它们应该对列表的元素 进行操作,而您的元素不是Maps。

以下代码适用于我:

List<String> list = Arrays.asList("A", "B", "C", "D");
Map<String, List<String>> map = list.stream()
        .collect(Collectors.toMap(Function.identity(), Arrays::asList));

Collectors.toMap 的第一个参数定义如何从列表元素生成键(保持原样),第二个参数定义如何生成值(使用单个元素生成 ArrayList)。

【讨论】:

您是否考虑将 (element) -> 元素替换为 Function.identity()? @Jeff 哦,这是一个不错的建议。我会更新我的答案。顺便说一句,它似乎对我有用,而无需明确指定类型参数。 酷。是的,不需要类型。这是一个复制/粘贴。 我已经用我正在寻找的解决方案更新了这个问题。谢谢! 此代码不适用于多个元素,请尝试使用List&lt;String&gt; list = Arrays.asList("A", "B", "C", "D", "A");【参考方案3】:

感谢大家的帮助! @izstas“他们应该对元素进行操作”帮助很大:)。实际上,这正是我想要准确的结果

public static void test2 ()
    Function<Entry<String, List<String>>, String> key = (entry) -> 
        return entry.getKey();
    ;
    Function<Entry<String, List<String>>, List<String>> value = (entry) -> 
        return new ArrayList<String>(entry.getValue());
    ;
    BinaryOperator<List<String>> merge = (old, latest)->
        old.addAll(latest);
        return old;
    ;

    Map<String, List<String>> map1 = new HashMap<>();
    map1.put("A", Arrays.asList("A1", "A2"));
    map1.put("B", Arrays.asList("B1"));
    map1.put("D", Arrays.asList("D1"));

    Map<String, List<String>> map2 = new HashMap<>();
    map2.put("C", Arrays.asList("C1","C2"));
    map2.put("D", Arrays.asList("D2"));

    Stream<Map<String, List<String>>> stream =Stream.of(map1, map2);
    System.out.println(stream.flatMap((map)->
        return map.entrySet().stream(); 
    ).collect(Collectors.toMap(key, value, merge)));

【讨论】:

以上是关于收集 HashMap<String, List<String>> java 8的主要内容,如果未能解决你的问题,请参考以下文章

Hashmap with Streams in Java 8 Streams 收集 Map 的值

如何将 HashMap 的值收集到向量中?

JAXB:如何编组 HashMap<String, HashMap<String, String>>?

JAVA这个能分页吗? List<HashMap<String, String>> list = new ArrayList<HashMap<String, Str

java中 ,ArrayList<HashMap<String,Object>> 和 HashMap<String, Object>() 有啥区别?

Android - 如何在活动之间传递 HashMap<String,String>?