2016-08-23 45 views
1

所以這更多的是性能或最佳實踐問題。 我得到了一個列表,用於保存自定義數據結構的條目。這看起來像:從流內操作數據而不是打開兩個流

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); 

我知道流不操縱數據,他們創造新數據,所以我不能刪除第二個流中的條目。這會導致ConcurrentModificationException。在我看來,我的結果只是一個解決方法,並不是非常高效。

如何提高這段代碼?

感謝的提前

+0

流並不總是最好的選擇。我想知道你爲什麼在這裏使用它們,而不是把你的輸入保存在一個'Map'中。 – Kayaman

+0

[David](http://stackoverflow.com/users/4796021/david-pérez-cabrera)給出的答案很好。但是地圖是最好的選擇。感謝@Kayaman – 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());