[Java] Java Stream 활용하여 두 개의 List 객체 비교하기

2022. 12. 12. 14:22 JAVA/Java

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

 

출처 : https://haenny.tistory.com/389