2016-08-23 6 views
1

を開くのではなく、ストリーム内からデータを操作します。これはパフォーマンスやベストプラクティスに関する質問です。 カスタムデータ構造のエントリを保持するListを取得しました。これは、次のようになります。私は私のリストからエントリを削除し、私はこれを行う別のリストにそれを追加したいので2つのストリーム

public class Entry { 
    private int id; 
    private String title; 
    private String description; 
    .... 
} 

私は、ストリームは、彼らが新しい作成し、データを操作しないでください知っている
Entry id = entries.stream().filter(e -> Integer.toString(e.getId()).equals(args[1])) 
        .map(e -> e).findAny().get(); 

entries.stream().filter(e -> Integer.toString(e.getId()).equals(args[1])) 
    .forEach(entry -> { 
      doneEntries.add(new Entry(entry.getTitle(), 
            entry.getDescription(), 
            "done", 
            entry.getTags(), 
            doneId)); 
      doneId+=1; 
    }); 
    entries.remove(id); 

私は2番目のストリームのエントリを削除することはできません。これにより、ConcurrentModificationExceptionが発生します。私の意見では、私の結果は単なる回避策であり、あまり効果がありません。

このコードセクションを改善するにはどうすればよいですか?

事前に感謝の

+0

ストリーム、常に最良の選択ではありません。私はなぜここでそれらを使用しているのだろうかと疑問に思います。 – Kayaman

+0

[David](http://stackoverflow.com/users/4796021/david-pérez-cabrera)の答えは良好でした。しかし、マップは間違いなく最良の選択です。 @カヤマンにありがとう – chrootzius

答えて

0

これを試してみてください:

entries = entries.stream().filter(e -> { 
     boolean result = true; 
     if (!Integer.toString(e.getId()).equals(args[1])) { 
      doneEntries.add(new Entry(e.getTitle(), e.getDescription(), "done", e.getTags(), doneEntries.size() + 1)); 
      result = false; 
     } 
     return result; 
    }).collect(Collectors.toList()); 
関連する問題