2017-05-24 6 views
5

저는 Java lambdas에 새로운 것이므로 원하는 것이 무엇인지를 확신 할 수 없습니다. 필터링 할 대상 목록이 있습니다. 주어진 조건에 일치되는 그 사람들을 추출하고 을 분리 된 목록에 넣어 (그래서 수정되지 않은 원본 목록을 유지, 그들에 대한 몇 가지 작업을 수행 할 수 있습니다) 나는이 함께했다 :Java lambdas : 목록에서 새 목록으로 노드 복사

List<Suggestion> only_translations = original_list.stream(). 
    filter(t -> t.isTranslation). 
    collect(Collectors.toCollection(() -> new ArrayList<Suggestion>())); 

그러나도 새 목록 객체를 얻는다면 노드는 원본 객체에 링크 된 것처럼 보이므로 (참조로 원래 목록에서 복사 된 새 객체가 아닌) 새 객체의 객체를 수정하면 원래 객체의 객체도 수정됩니다 .

그래서 나는 그것을 성취 할 수 있는지 알고 싶습니다. (람다를 사용하면 모든 요소를 ​​반복하는 "고전적"방식으로 할 수 있습니다.) 그리고 그 경우에는 어떻게 할 수 있는지 알고 싶습니다. 미리 감사드립니다.

+0

'collect()'는 변경 가능한 축소를위한 것입니다. –

+0

그래서 ... 대신 무엇을 사용해야합니까? – motagirl2

+1

@JudeNiroshan - 당신이 어떤 주장을 하느냐에 달려 있습니다. 'collect (Collectors.toList())'를 예로들 수 있습니다. –

답변

5

약간의 (a Copyable<Suggestion> 인터페이스를 구현 같은)을 public Suggestion copy(); 방법을 가지고 당신의 제안을 가정하면, 당신은 할 수 :

List<Suggestion> only_translations = original_list.stream() 
.filter(t -> t.isTranslation) 
.map(t -> t.copy())  // or .map(Suggestion::copy) 
.collect(Collectors.toList())); 

편집 : 복사 생성자와 :

List<Suggestion> only_translations = original_list.stream() 
.filter(t -> t.isTranslation) 
.map(t -> new Suggestion(t)) // or .map(Suggestion::new) 
.collect(Collectors.toList())); 
+3

''Suggestion :: copy' 또는'Suggestion :: new'로 각각 단축 할 수 있습니다. –

+1

감사합니다. Jeremy, 그것은 매력처럼 작동했습니다. – motagirl2

+0

@OliverCharlesworth 전 사본 부분에 전적으로 동의합니다. 그러나 컴파일러 (또는 세심한 독자)가 'UnaryOperator '이라는 것을 이해하더라도, 다른 생성자와 쉽게 혼동 될 수 있으므로'Suggestion :: new' 단축 구문을 싫어합니다. 긴 버전은 더 읽기 쉬운 IMO입니다. –

1

당신은 당신이 말 때문에 복사 생성자를 사용하려면 복사 작업 전에 복사 작업을 추가하여 복사 된 개체의 목록을 가져 오십시오.

.map(Suggestion::new)