[Java] Java Stream 활용하여 두 개의 List 객체 비교하기
Stream. -Match 메소드 예제
- allMatch() : 모든 요소들이 매개 값(Predicate)로 주어진 조건을 만족하는지 조사
- anyMatch() : 최소한 한 개의 요소가 주어진 조건에 만족하는 지 조사
- noneMatch() : 모든 요소들이 주어진 조건을 만족하지 않는지 조사
class Test {
public static void main(String[] args) {
int[] intArray = {2, 4, 6};
boolean allResult = Arrays.stream(intArray).allMatch(a -> a % 2 == 0);
boolean anyResult = Arrays.stream(intArray).anyMatch(a -> a % 2 == 0);
boolean noneResult = Arrays.stream(intArray).noneMatch(a -> a % 2 == 0);
System.out.println(allResult); // true
System.out.println(anyResult); // true
System.out.println(noneResult); // false
}
}
응용1. 두 개의 List 중복된 값 찾기
class Test {
public static void main(String[] args) {
List<String> oldList = Arrays.asList("1", "2", "3", "4");
List<String> newList = Arrays.asList("3", "4", "5", "6");
List<String> matchList = oldList.stream().filter(o -> newList.stream()
.anyMatch(Predicate.isEqual(o))).collect(Collectors.toList());
System.out.println(matchList.toString()); // [3,4]
}
}
응용2. 두 개의 List 중복되지 않은 값 찾기
- List A 기준 중복되지 않은 값 찾기
- List B 기준 중복되지 않은 값 찾기
class Test {
public static void main(String[] args) {
List<String> oldList = Arrays.asList("1", "2", "3", "4");
List<String> newList = Arrays.asList("3", "4", "5", "6");
List<String> oldNoneMatchList = oldList.stream().filter(o -> newList.stream()
.noneMatch(Predicate.isEqual(o))).collect(Collectors.toList());
List<String> newNoneMatchList = newList.stream().filter(n -> oldList.stream()
.noneMatch(Predicate.isEqual(n))).collect(Collectors.toList());
System.out.println(oldNoneMatchList.toString()); // [1,2]
System.out.println(newNoneMatchList.toString()); // [5,6]
}
}
객체의 리스트 비교하기
다음과 같이 origin 리스트와 new 리스트가 있다고 하자.
class Test {
public static void main(String[] args) {
Info a = new Info("1", "A", String.valueOf(UUID.randomUUID()));
Info b = new Info("2", "B", String.valueOf(UUID.randomUUID()));
Info c = new Info("3", "C", String.valueOf(UUID.randomUUID()));
List<Info> oldList = Arrays.asList(a, b, c);
Info d = new Info("1", "A", String.valueOf(UUID.randomUUID()));
Info e = new Info("4", "B", String.valueOf(UUID.randomUUID()));
List<Info> newList = Arrays.asList(d, e);
//...
}
private static class Info {
String id;
String name;
String temp;
Info (String a, String b, String c) {
this.id = a;
this.name = b;
this.temp = c;
}
// getter, setter, toString 생략
}
id만 비교하여 중복되지 않은 값 찾기
- List A 기준 id만 비교하여 중복되지 않은 값 찾기
- List B 기준 id만 비교하여 중복되지 않은 값 찾기
// .. 중략
List<Info> resultList1 = oldList.stream().filter(o -> newList.stream().noneMatch(n -> {
return o.getId().equals(n.getId());
})).collect(Collectors.toList());
System.out.println(resultList1.toString()); // [{id="2", ..}, {id="3", ..}]
List<Info> resultList2 = newList.stream().filter(n -> oldList.stream().noneMatch(o -> {
return o.getId().equals(n.getId());
})).collect(Collectors.toList());
System.out.println(resultList2.toString()); // [{id="4", ..}]
// .. 중략
id와 name (다중필드) 비교하여 중복된 값 찾기
- List A 기준 id , name 비교하여 중복되지 않은 값 찾기
- (이쯤되면 이해했을 거라 생각하고 예제 하나만..)
// .. 중략
List<Info> resultList1 = oldList.stream().filter(o -> newList.stream().noneMatch(n -> {
return o.getId().equals(n.getId()) && o.getName().equals(n.getName());
})).collect(Collectors.toList());
System.out.println(resultList1.toString()); // [{id="2", ..}, {id="3", ..}]
// .. 중략
참고
https://cornswrold.tistory.com/300
https://kyhyuk.tistory.com/184
'JAVA > Java' 카테고리의 다른 글
[Java] 문자열, 객체, 배열 Null Check (0) | 2022.12.12 |
---|---|
[Java] 객체 매핑 라이브러리 ModelMapper 살펴보자 (1) | 2022.12.12 |
[Java] 중복 키 허용 MultiValueMap 와 HashMap 차이 (0) | 2022.12.12 |
[Java] Comparator, Lamda 사용하여 2차원 배열 정렬하기 (0) | 2022.12.12 |
[Java] Arrays.sort 와 Collections.sort 정리 (0) | 2022.12.12 |
[Java] StringTokenizer Class 사용 및 Split 비교 (0) | 2022.12.12 |
[Java] 스트림 (Stream) 타입별 변환 (0) | 2022.12.12 |
[Java] POI 엑셀 다운로드 시 Invalid char (/) found at index (6) in sheet name 에러 (0) | 2022.12.12 |