元の投稿にコメントを追加すると、これが私が思いついたコードです。明らかに、整数が にマップされた 1 対多の関係が必要であると想定していList<String>
ます。
public class MappingDemo {
public static void main(String[] args) {
MappingDemo demo = new MappingDemo();
System.out.println("... Using custom collector ...");
demo.dumpMap(demo.getFruitMappingsWithCustomCollector());
System.out.println("... Using 'External' map ...");
demo.dumpMap(demo.getFruitMappingsWithExternalMap());
}
public Map<Integer, List<String>> getFruitMappingsWithCustomCollector(){
// Resulting map is created from within the lambda expression.
return getContent().stream().map(s -> s.split(",\\s"))
.collect(
HashMap::new,
(map, ary) -> map.computeIfAbsent(Integer.parseInt(ary[0]),
k -> new ArrayList<>()).add(ary[1]),
(map1, map2) -> map1.entrySet().addAll(map2.entrySet())
);
}
public Map<Integer,List<String>> getFruitMappingsWithExternalMap(){
// Create the map external from the lambda and add to it.
final Map<Integer,List<String>> fruitMappings = new HashMap<>();
getContent().stream().map(s -> s.split(",\\s"))
.forEach(ary ->
fruitMappings.computeIfAbsent(Integer.parseInt(ary[0]),
k -> new ArrayList<>()).add(ary[1]));
return fruitMappings;
}
public void dumpMap(Map<Integer,List<String>> map){
map.entrySet().forEach(e -> System.out.println(e.getKey() + " -> " + e.getValue()));
}
public List<String> getContent(){
return Arrays.asList("1, Apple",
"1, Pear",
"1, Orange",
"2, Apple",
"3, Melon",
"3, Orange",
"1, Mango",
"3, Star Fruit",
"4, Pineapple",
"2, Pomegranate");
}
}
そして出力
... カスタムコレクターの使用 ...
1 -> [リンゴ、ナシ、オレンジ、マンゴー]
2 -> [リンゴ、ザクロ]
3 -> [メロン、オレンジ、スターフルーツ]
4 -> [パイナップル]
... 「外部」マップを使用 ...
1 -> [リンゴ、ナシ、オレンジ、マンゴー]
2 -> [リンゴ、ザクロ]
3 -> [メロン、オレンジ、スターフルーツ]
4 -> [パイナップル]
誰かがもっとうまくやれると確信しています。
getContent
指定したテキストを使用して値を取得するための単純な手段でした。実際Files.readAllLines
に. _getContent()
File