[JAVA] Stream 사용하기(스트림)- 4. 리스트 비교하기

Posted by 김성철

JAVA Stream 사용하기(스트림)- 4. 리스트 비교하기

https://kyhyuk.tistory.com/m/184  
사용하게된 이유는 두개의 리스트를 비교해서 DB에 Insert Update Delete 를 해줘야함  
	※ 없으면 insert , 변경되었으면 update , 제거되었으면 delete  
newList는 신규 데이터 리스트,  
oldList는 기존 DB에 있는 데이터 리스트  

소스코드

=================================================================================================================  
package com.sungchul;  
  
import java.util.ArrayList;  
import java.util.List;  
import java.util.function.Predicate;  
import java.util.stream.Collectors;  
import java.util.stream.Stream;  
  
public class ListCompareTestClass {  
	public static void main(String[]args) {  
  
		List<TestVO> newList = new ArrayList<>();  
		List<TestVO> oldList = new ArrayList<>();  
		for (int i = 0; i < 10; i++) {  
			int temp = i+2;  
			if(i%3==0){  
				temp=i+100;  
			}  
			TestVO oldTestVO = new TestVO(i, i + "데이터");  
  
			TestVO newTestVO = new TestVO(i + 2, temp + "데이터");  
			oldList.add(oldTestVO);  
			newList.add(newTestVO);  
		}  
		Stream.of(oldList).forEach(System.out::println);  
		Stream.of(newList).forEach(System.out::println);  
  
		//seq만을 가져와서 비교, oldList만 존재하는 데이터  
		List<TestVO> noneMatchList = oldList.stream()  
				.filter(n -> newList.stream()  
						.noneMatch(o -> n.getSeq() == o.getSeq()))  
				.collect(Collectors.toList());  
  
		//seq만을 가져와서 비교, oldList만 존재하는 데이터  
		List<TestVO> anyMatchList = newList.stream()  
				.filter(o -> oldList.stream()  
						.noneMatch(n -> o.getSeq() == n.getSeq()))  
				.collect(Collectors.toList());  
  
		System.out.println();  
		System.out.println("삭제해야할 기존 데이터");  
		for (TestVO t1 : noneMatchList) {  
			System.out.println(t1);  
		}  
		System.out.println();  
		System.out.println("생성해야할 신규 데이터");  
		for (TestVO t2 : anyMatchList) {  
			System.out.println(t2);  
		}  
  
		//seq(키값)이 일치하는 애들만 조회  
		List<TestVO> tempList = newList.stream()  
				.filter(o -> oldList.stream()  
						.anyMatch(n -> o.getSeq() == n.getSeq()))  
				.collect(Collectors.toList());  
  
		System.out.println();  
		System.out.println("seq 일치하는 데이터");  
		for(TestVO t3 : tempList){  
			System.out.println(t3);  
		}  
  
		//seq가 일치하는 데이터중 value가 일치하지 않는 데이터만 필터  
		List<TestVO> notCompareList = tempList.stream()  
									  .filter(old -> oldList.stream().noneMatch(Predicate.isEqual(old)))  
									  .collect(Collectors.toList());  
  
		System.out.println();  
		System.out.println("seq는 일치하면서 , value는 일치하지 않는 데이터");  
		for(TestVO t4 : notCompareList){  
			System.out.println(t4);  
		}  
  
		//seq와 value가 둘다 일치하는 데이터  
		List<TestVO> compareList = tempList.stream()  
				.filter(old -> oldList.stream().anyMatch(Predicate.isEqual(old)))  
				.collect(Collectors.toList());  
		System.out.println();  
		System.out.println("seq도 일치하고, value도 일치하는 데이터");  
		for(TestVO t5 : compareList){  
			System.out.println(t5);  
		}  
  
		//리스트 두개의 값에서 중복값 제거하기  
		List<String> list1 = new ArrayList<>();  
		list1.add("apple");  
		list1.add("banana");  
		list1.add("orange");  
  
		List<String> list2 = new ArrayList<>();  
		list2.add("banana");  
		list2.add("grape");  
		list2.add("kiwi");  
  
		List<String> uniqueValues = Stream.concat(list1.stream(), list2.stream())  
				.distinct()  
				.collect(Collectors.toList());  
  
		System.out.println(uniqueValues);  
  
		//list1 기준 일치하지 않는 값만 가져오기  
		List<String> list1 = new ArrayList<>();  
		list1.add("apple");  
		list1.add("banana");  
		list1.add("orange");  
  
		List<String> list2 = new ArrayList<>();  
		list2.add("banana");  
		list2.add("grape");  
		list2.add("kiwi");  
  
		List<String> nonMatchingValues = list1.stream()  
				.filter(value -> !list2.contains(value))  
				.collect(Collectors.toList());  
  
		System.out.println(nonMatchingValues);  
  
		//두개의 리스트에서 일치하지 않는 값 가져오기  
		List<String> list1 = new ArrayList<>();  
		list1.add("apple");  
		list1.add("banana");  
		list1.add("orange");  
  
		List<String> list2 = new ArrayList<>();  
		list2.add("banana");  
		list2.add("grape");  
		list2.add("kiwi");  
  
		Set<String> uniqueValues = new HashSet<>(list1);  
		uniqueValues.addAll(list2);  
  
		List<String> nonMatchingValues = uniqueValues.stream()  
				.filter(value -> !(list1.contains(value) && list2.contains(value)))  
				.collect(Collectors.toList());  
  
		System.out.println(nonMatchingValues);  
  
	}  
}  
  
class TestVO{  
  
	int seq;  
	String value;  
  
	public TestVO(int seq , String value){  
		this.seq = seq;  
		this.value = value;  
	}  
	public int getSeq() {  
		return seq;  
	}  
	public void setSeq(int seq) {  
		this.seq = seq;  
	}  
  
	public String getValue() {  
		return value;  
	}  
  
	public void setValue(String value) {  
		this.value = value;  
	}  
  
	@Override  
	public String toString() {  
		return "TestVO{" +  
				"seq=" + seq +  
				", value='" + value + '\'' +  
				'}';  
	}  
  
	@Override  
	public boolean equals(Object o) {  
		TestVO t = (TestVO) o;  
		if (this.value.equals(t.getValue())) {  
			return true;  
		} else {  
			return false;  
		}  
	}  
}  
=================================================================================================================