Map<X, List<String>>
Xpによるグループ化を減らし、すべてのリスト値を同時に結合Map<Integer, List<String>>
して、最後に含めるにはどうすればよいですか?
これは私がこれまでに試したことです:
class X {
int p;
int q;
public X(int p, int q) { this.p = p; this.q = q; }
}
Map<X, List<String>> x = new HashMap<>();
x.put(new X(123,5), Arrays.asList("A","B"));
x.put(new X(123,6), Arrays.asList("C","D"));
x.put(new X(124,7), Arrays.asList("E","F"));
Map<Integer, List<String>> z = x.entrySet().stream().collect(Collectors.groupingBy(
entry -> entry.getKey().p,
mapping(Map.Entry::getValue,
reducing(new ArrayList<>(), (a, b) -> { a.addAll(b); return a; }))));
System.out.println("z="+z);
しかし、結果は次のようになります:z = {123 = [E、F、A、B、C、D]、124 = [E、F、A、B、C、D]}。
z = {123 = [A、B、C、D]、124 = [E、F]}にしたい
reducing
コレクターを誤って使用しています。最初の引数は、削減操作のID値である必要があります。ただし、値を追加して変更しているため、結果が完全に説明されます。すべての値が同じ値に追加ArrayList
され、不変のID値であることが期待されます。
あなたがしたいのは可変削減であり、それにCollectors.reducing
は適切ではありません。次の方法を使用して、適切なコレクターを作成できますCollector.of(…)
。
Map<Integer, List<String>> z = x.entrySet().stream().collect(groupingBy(
entry -> entry.getKey().p, Collector.of(
ArrayList::new, (l,e)->l.addAll(e.getValue()), (a,b)->{a.addAll(b);return a;})));
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加