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)));
}
コードで定義した関数key
およびvalue
は、リストのelementsを操作する必要があり、要素が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
の最初の引数はリスト要素からキーを作成する方法を定義し(そのままにして)、2番目の引数は値を作成する方法を定義します(単一要素でArrayList
を作成します)。
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(groupingBy(Function.identity()));
}
より柔軟にしたい場合(たとえば、値をマップして、リストの代わりにSetを返す)、javadocで指定されているより多くのパラメーターでgroupingBy
メソッドを常に使用できます。
Map<City, Set<String>> namesByCity = people.stream().collect(groupingBy(Person::getCity, mapping(Person::getLastName, toSet())));
すべての助けてくれてありがとう! @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)));
}