收集 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->List(A), B->List(B), C-> List(C)
)。我尝试使用toMap()
并将其传递给keyMapper
和ValueMapper
,但出现编译错误。如果有人可以帮助我,我将不胜感激。
谢谢!
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 确实存在吗?? 对不起,我修正了这个例子。方法groupingBy
是java.util.stream.Collectors
中的静态方法。
在地图上非常出色您在代码中定义的函数key
和value
不正确,因为它们应该对列表的元素 进行操作,而您的元素不是Map
s。
以下代码适用于我:
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.List<String> 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 的值
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>() 有啥区别?