본문 바로가기
Dev

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

by 보리맥콜 2022. 2. 11.
반응형

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

 

반응형