스트림이있는 Java 8에서는 실제로 매우 간단합니다. 편집 : 스트림없이 효율적일 수 있습니다.
List<String> listA = Arrays.asList("2009-05-18","2009-05-19","2009-05-21");
List<String> listB = Arrays.asList("2009-05-18","2009-05-18","2009-05-19","2009-05-19",
"2009-05-20","2009-05-21","2009-05-21","2009-05-22");
List<String> result = listB.stream()
.filter(not(new HashSet<>(listA)::contains))
.collect(Collectors.toList());
해시 세트는 한 번만 생성됩니다. 메서드 참조는 contains 메서드에 연결됩니다. 람다로 동일한 작업을 수행하려면 변수에 세트가 있어야합니다. 변수를 만드는 것은 나쁜 생각이 아닙니다. 특히보기 흉하거나 이해하기 어렵다면 더욱 그렇습니다.
네 게이트 메서드 참조를 직접 호출 할 수 없기 때문에이 유틸리티 메서드 (또는 명시 적 캐스트)없이 술어 를 쉽게 부정 할 수 없습니다 (먼저 유형 추론이 필요함).
private static <T> Predicate<T> not(Predicate<T> predicate) {
return predicate.negate();
}
스트림에 filterOut
메서드 나 무언가 가 있으면 더 좋아 보일 것입니다.
또한 @Holger가 나에게 아이디어를 주었다. ArrayList
그있다 removeAll
방법은 여러 제거를 위해 최적화 된, 그것은 단지 요소 번 재 배열. 그러나 contains
주어진 컬렉션에서 제공 하는 방법을 사용 하므로 listA
작은 부분이 아닌 경우 해당 부분을 최적화해야합니다 .
로 listA
와 listB
이전에 선언이 솔루션은 자바 8 필요하지 않습니다 그리고 그것은 매우 효율적입니다.
List<String> result = new ArrayList(listB);
result.removeAll(new HashSet<>(listA));