자바8부터 지원되는 stream은 기존 배열,컬렉션을 다루는 방법을 보다 간결하게 표현할 수 있도록 도와줍니다.
최근에 stream을 사용하는 일이 많아지면서 시간이 날 때마다 정리를 해야겠다는 들었습니다.
아래는 두 리스트간 중복되거나 중복되지 않는 값만 추출하는 예제입니다.
list2.stream().noneMatch(Predicate.isEqual(old)))
Predicate 함수형 인터페이스의 isEqual() 함수를 이용해 인자값으로 전달된 객체(old : list1의 아이템)와 같은지 비교할 조건식을 만듭니다.
list1의 스트림 객체에서 해당 조건식을 만족하는 값만 필터링합니다.(list1 : list2의 값이 다른것만)
그리고 collect() 함수를 이용해 Stream의 아이템들을 리스트 객체로 리턴합니다.
중복되는 값만 추출하는 경우는 noneMatch가 아닌 anyMatch로 중복값이 있는 것만 뽑도록 합니다.
package com.java.stream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class MyList {
public static void compareList() {
List<String> list1 = new ArrayList<String>(Arrays.asList("1", "2", "3", "4"));
List<String> list2 = new ArrayList<String>(Arrays.asList("3", "4", "5", "6"));
List<String> resultList = list1.stream()
.filter(old -> list2.stream()
.noneMatch(Predicate.isEqual(old)))
.collect(Collectors.toList());
System.out.println("resultList => " + resultList); //중복되지 않는 값만 추출
List<String> resultList2 = list1.stream()
.filter(old -> list2.stream()
.anyMatch(Predicate.isEqual(old)))
.collect(Collectors.toList());
System.out.println("resultList2 => " + resultList2); //중복되는 값만 추출
}
public static void main(String[] args) {
compareList();
}
}
+ 피드백은 언제나 환영입니다 :)