2016-08-23 2 views
1

이것은 성능 또는 모범 사례에 관한 더 많은 질문입니다. 사용자 지정 데이터 구조의 항목을 보유하는 List가 있습니다. 이 같이 보인다 : 내 목록에서 항목을 삭제하고 내가 이렇게 다른 목록에 추가 할 그래서두 개의 스트림을 열지 않고 스트림 내에서 데이터를 조작하십시오.

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이 발생합니다. 제 생각에는 제 결과는 단지 해결 방법 일 뿐이며 성과가 좋지 않습니다.

이 코드 섹션을 향상시키는 방법?

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()); 
+0

스트림입니다 항상 최선의 선택을 : – Kayaman

+0

[David] (http://stackoverflow.com/users/4796021/david-pérez-cabrera)의 답이 좋았습니다. 그러나지도가 가장 좋은 선택입니다. @ 카야 만에게 감사합니다. – chrootzius

답변

0

이 함께 시도 사전

에서

감사의. 나는 왜 당신이 여기에 예를 들어`Map`에 엔트리를 유지하는 대신에 그것들을 사용하는지 궁금합니다.