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;
}
}
}
=================================================================================================================