削減()ストリーム上の操作は、データのソースを修正しているようだ(リスト)ストリームAPIのJava 8

PeeCee:

私は3つのプライベートプロパティ文字列型、重量および文字列IDを持つ単純なのPOJOと呼ばれるトランザクションを持っています。メインクラスでは、私は下に書かれたコンストラクタを呼び出すトランザクションの数のインスタンスを作成しました -

List<Transaction> transList = Arrays.asList(new Transaction(Transaction.TRANSACTION_TYPE_GROCERY,45.50,"2a"),
                                            new Transaction(Transaction.TRANSACTION_TYPE_GROCERY,50.0,"1a"),
                                            new Transaction(Transaction.TRANSACTION_TYPE_GROCERY,15.00,"3a"),
                                            new Transaction(Transaction.TRANSACTION_TYPE_GROCERY,27.43,"4a"),
                                            new Transaction(Transaction.TRANSACTION_TYPE_CLOTHING,145.0,"5a"),
                                            new Transaction(Transaction.TRANSACTION_TYPE_CLOTHING,105.0,"6a"));

今私はコードの下、このlistusing上の操作を下回ると呼ばれています -

Optional<Transaction> totalA = transList.stream()
.filter(x->x.getType()==Transaction.TRANSACTION_TYPE_GROCERY)
.reduce((a,b) -> {Transaction z = b;                                                                             
                  z.setAmount(a.getAmount()+b.getAmount());
                  return z;});

ここで私は、最低単位として取引を維持することにより、リダクション演算を実行し、すべての取引金額の合計を計算し、新しいトランザクションZの内側にそれを設定しようとしています。このすべては、オプションとして、最終的に格納されます。私はtransListデータソース上の他の操作を実行しようとした場合transListの状態が乱れますように、この後、私は間違った結果を取得します。

List<String> transactionIds = transList.stream()
                                                .filter(x -> x.getAmount()>50.00)
                                                .map(Transaction::getId)
                                                .collect(Collectors.toList());
System.out.println(transactionIds);

私は(減らす使用して、このリストのために成功したダブルアイテムとダブル戻り値の実装を含む省略可能)を行っています。私が知りたいすべてが、それはストリームが機能しているよう起こるべきではありません自体のデータソースを、変更終わるというオプションを持つので、間違っているものです。

ジャコモAlzetta:

ラムダ:

(a,b) -> {Transaction z = b;                                                                             
                  z.setAmount(a.getAmount()+b.getAmount());
                  return z;}

変更されbたパラメータを。assignementはないことに注意してくださいではないので、オブジェクトのコピーTransaction z = bだけが指すオブジェクトへのエイリアスを与えているしb

あなたは、おそらく使用する必要がありますreduceOSは単にオブジェクトのコピーを作成し、アイデンティティとコンバイナを指定することができ、過負荷を。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=233749&siteId=1