1

私はJava 8のストリームに非常に慣れていないので、私のアプローチが間違っている可能性があります.

私は次のように2つのオブジェクトを持っています

object1 {
    BigDecimal amount;
    Code1 code1;
    Code2 code2;
    Code3 code3;
    String desc;
}

object2 {
    BigDecimal amount;
    Code1 code1;
    Code2 code2;
    Code3 code3;
}

したがって、code1 && code2 && code3 が同じであるすべての object1 を収集し、その量を合計して object2 リストに追加します。

私はそれを行うコードを持っていません... http://docs.oracle.com/javase/tutorial/collections/interfaces/map.htmlから何かを実装しようとしている仕事をするコードを書きたいです

または、部門ごとのすべての給与の合計を計算します。

// Compute sum of salaries by department
Map<Department, Integer> totalByDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment,
Collectors.summingInt(Employee::getSalary)));
4

1 に答える 1

5

私を正しい方向に向けてくれた JB Nizet に感謝します。object2 を変更する必要がありました

public class CodeSummary {
    Double amount;
    CodeKey key;
//getters and setters

}
public class CodeKey {
    String code1;
    String code2;
    String code3;
//getters and setters

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof CodeKey)) return false;

        CodeKey that = (CodeKey) o;

        if (!code1.equals(that.code1)) return false;
        if (!code2.equals(that.code2)) return false;
        if (!code3.equals(that.code3)) return false;

        return true;
    }

@Override
public int hashCode() {
    int result = code1.hashCode();
    result = 31 * result + code2.hashCode();
    result = 31 * result + code3.hashCode();
    return result;
}

}

object1 を反復処理し、object2 に入力します。object2 (現在は codeSymmary) にデータを入力したら。以下の方法を使用して仕事をすることができました。

        Map<CodeKey, Double> summaryMap = summaries.parallelStream().
                collect(Collectors.groupingBy(CodeSummary::getKey,
                Collectors.summingDouble(CodeSummary::getAmount))); // summing the amount of grouped codes.

誰かがこれを例として使用している場合。次に、キー オブジェクトの equal および hashcode 関数をオーバーライドしてください。そうしないと、グループ化は機能しません。

これが誰かを助けることを願っています

于 2015-02-11T16:17:27.747 に答える