Programming language/Java

[Java]Stream 활용 : 두 리스트의 중복값 찾기

  • -
반응형

자바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();
	} 
	
}

결과


+ 피드백은 언제나 환영입니다 :)

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.