Java 8ストリームAPIを初めて使用しましたが、次の問題に使用する予定です。Java 8ストリーム:他のコレクタに基づくコレクタの定義
public class InputRecord {
private String name;
private Integer fieldA;
private BigDecimal fieldB;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getFieldA() {
return fieldA;
}
public void setFieldA(Integer fieldA) {
this.fieldA = fieldA;
}
public BigDecimal getFieldB() {
return fieldB;
}
public void setFieldB(BigDecimal fieldB) {
this.fieldB = fieldB;
}
}
ニーズに上記のもの4つのレコードを:
name | fieldA | fieldB
----------------------
A | 100 | 1.1
A | 150 | 2.0
B | 200 | 1.5
A | 120 | 1.3
InputRecord
のようになります。私はPOJOはname
、fieldA
を含むInputRecord
と呼ばれていて、次の各行レコードを表すことができfieldB
性質が言います名前でグループ化された2つのレコードに結合することができます。
- プロパティ
fieldA
は、 - 合わせレコード
fieldA
とfieldB
両方の累積和を乗算した結果であるfieldC
プロパティを含むが加算されるプロパティfieldB
- が加算されます。
したがって、上記の結果であろう:
name | sumOfFieldA | sumOfFieldB | fieldC (sumOfFieldA*sumOfFieldB)
-------------------------------------------------------------------
A | 370 | 4.4 | 1628
B | 200 | 1.5 | 300
は異なるPOJOはOutputRecord
を組み合わせたレコードの各行レコードを表すことになると呼ばれる。
public class OutputRecord {
private String name;
private Integer sumOfFieldA;
private BigDecimal sumOfFieldB;
private BigDecimal fieldC;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSumOfFieldA() {
return sumOfFieldA;
}
public void setSumOfFieldA(Integer sumOfFieldA) {
this.sumOfFieldA = sumOfFieldA;
}
public BigDecimal getSumOfFieldB() {
return sumOfFieldB;
}
public void setSumOfFieldB(BigDecimal sumOfFieldB) {
this.sumOfFieldB = sumOfFieldB;
}
public BigDecimal getFieldC() {
return fieldC;
}
public void setFieldC(BigDecimal fieldC) {
this.fieldC = fieldC;
}
}
いくつかの良いアプローチ/ソリューションは何InputRecordsのリストをOutputRecordsのリストに変換するには?
次のリンクは役立つだろうが、私はfieldC
のための新しいコレクタを形成するために一緒に
fieldA
と
fieldB
のためのコレクターを置くしようとして捕まってしまった場合、私は見ていた
: Java 8 Stream: groupingBy with multiple Collectors
Collector<InputRecord, ?, Integer> fieldACollector = Collectors.summingInt(InputRecord::getFieldA);
Collector<InputRecord, ?, BigDecimal> fieldBCollector = Collectors.reducing(BigDecimal.ZERO, InputRecord::getFieldB, BigDecimal::add);
List<Collector<InputRecord, ?, ?>> collectors = Arrays.asList(fieldACollector, fieldBCollector); // need a fieldCCollector object in the list
collectors
オブジェクトですその後、 complexCollector
オブジェクトを作成するために使用することができます(上記のリンクのTagir Valeevによる承認済みの回答に従って)。
なぜあなたは飛行機でそれを計算することができるときに 'fieldC'を必要としますか? – shmosel
POJOに関する詳細情報を含めることができますか?それは変更可能ですか?それはゲッターを持っていますか?コンストラクタはどのように見えますか? – shmosel
ありがとう私は詳細を追加しました。 POJOを変更することができます – Mark