Collectors.groupingBy()
を使用してオブジェクトをグループ化するためにオブジェクトmyClass
のコレクションをストリーミングしたいとします。しかし、Map<String, List<myClass>>
を取得する代わりに、オブジェクトmyOutput
にグループ化してMap<String, myOutput>
を取得したいと考えています。私は、カスタムコレクタを作成しようとしました:オブジェクトにコレクタを持つJava 8 GroupingBy
List<myClass> myList = new ArrayList<myClass>();
myList.add(new myClass("a", 1));
myList.add(new myClass("a", 2));
myList.add(new myClass("b", 3));
myList.add(new myClass("b", 4));
Map<String,myOutput> myMap = myList.stream().collect(Collectors.groupingBy(myClass::getA, Collectors.of(myOutput::new, myOutput::accept, myOutput::combine)));
MYCLASS:
protected String a;
protected int b;
public myClass(String aA, int aB)
{
a = aA;
b = aB;
}
public String getA()
{
return a;
}
public int getB()
{
return b;
}
がmyOutput:
protected int i;
public myOutput()
{
i = 0;
}
public void accept(myClass aMyClass)
{
i += aMyClass.getB();
}
public myOutput combine(myOutput aMyOutput)
{
i += aMyOutput.getI();
return this;
}
public int getI()
{
return i;
}
しかし、このコードで、コレクターに問題がある:
Collectors.of(myOutput::new, myOutput::accept, myOutput::combine)
この場合、私は知っていますreduceははるかに簡単ですが、myOutputオブジェクトで行う操作が多いとしましょう。
このコレクターに問題がありますか?
ありがとう:あなたは、組み込みの
Collectors.summingInt(mapper)
マッパーがb
値を返す場所を使用することができます。私は非常に近いです:(組み込みのsummingIntコレクタがこのケースではより良い選択肢になることは確かですが、わかりやすい例で私の問題を説明したかったのですが、myClassとmyOutputオブジェクトはもっと複雑になりました。 –