[자바] java8 stream 리스트 객체 2개 비교

2022. 2. 11. 02:12Dev

반응형

자바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을 사용하는 방법도 있다는 정도로 알고 있으면 좋을 것 같다.

 

반응형