[자바] java8 stream 리스트 객체 2개 비교
2022. 2. 11. 02:12ㆍDev
반응형
자바8 stream을 사용해서 리스트 객체 2개를 비교하는 글은 많이 있다.
아래의 예제는 String 으로 이루어진 리스트 2개를 비교하여 조건에 맞는 리스트를 필터링하는 예제이다.
@Test
void testList(){
List<String> originalList = Arrays.asList("a1", "a2", "a3", "a4");
List<String> filterList = Arrays.asList("a3", "a4", "a5", "a6");
List<String> filteredList = originalList.stream()
.filter(item -> filterList.stream().noneMatch(Predicate.isEqual(item)))
.collect(Collectors.toList());
//originalList 를 기준으로 비교하여 일치하지 않는(noneMatch) 값 찾기
System.out.println(filteredList); //a1, a2
List<String> filteredTargetList = filterList.stream()
.filter(target -> originalList.stream().noneMatch(Predicate.isEqual(target)))
.collect(Collectors.toList());
//filterList 를 기준으로 비교하여 일치하지 않는(noneMatch) 값 찾기
System.out.println(filteredTargetList); //a5, a6
}
noneMatch : 불일치
anyMatch : 일치
allMatch : 모두 일치
하지만, 특정 객체로 이루어진 리스트에서 특정 멤버변수 값만 비교해서 필터링하고 싶다면??
public class Item {
private String itemCd;
private String itemNm;
}
위와 같은 Item 클래스가 있다고 치자.
Item 클래스로 이루어진 List 객체가 2개가 있을 때, 특정 변수로 비교하려면 어떻게 해야 할까?
예를 들면, itemCd 값으로 비교하려면?
List<Item> oriList = Arrays.asList(new Item("sword","집행검"), new Item("armor","갑옷");
List<Item> newList = Arrays.asList(new Item("sword","집행검"), new Item("boots","신발");
List<Item> filteredList = oriList.stream()
.filter(oriItem -> newList.stream()
.anyMatch(newItem -> oriItem.getItemCd().equals(oriItem.getItemCd())))
.collect(Collectors.toList());
System.out.println(filteredList); //[Item(itemCd=sword, itemNm=집행검)]
anyMatch 함수를 사용했으므로 itemCd 값이 같은 객체를 필터링하여 반환한다.
이중 for문으로도 해결 가능하지만, stream을 사용하는 방법도 있다는 정도로 알고 있으면 좋을 것 같다.
반응형