개발/Java

[Java] 두 개의 List를 stream을 사용해서 비교하기

yhyuk 2021. 10. 28. 10:05
728x90
반응형

List를 비교하는 방법은 여러가지가 있다. 오늘은 java8부터 제공하는 stream을 사용해서 비교하는 방법을 알아보려고 한다.

 

예제1. List 2개를 각각 비교해 중복 되지 않은 값 찾기

void listTest() {
    List<String> oldList = Arrays.asList("1", "2", "3", "4");
    List<String> newList = Arrays.asList("3", "4", "5", "6");

    List<String> resultList1 = oldList.stream()
                            .filter(old -> newList.stream().noneMatch(Predicate.isEqual(old)))
                            .collect(Collectors.toList());

    System.out.println(resultList1); // [1, 2]


    List<String> resultList2 = newList.stream()
                            .filter(new -> oldList.stream().noneMatch(Predicate.isEqual(new)))
                            .collect(Collectors.toList());

    System.out.println(resultList2); // [5, 6]
}
  • noneMatch: 중복 X
  • anyMatch: 중복 O

 

예제2. List 2개를 id만 비교하여 중복되지 않은 값 찾기

public static class User {
    private String id;
    private String name;
    
    public User(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

}
void listTest() {
    List<User> targetList = Arrays.asList(new User("10001", "홍길동"), new User("10002", "아무개"), new User("10003", "하하하"));
    List<User> filterList = Arrays.asList(new User("10003", "홍길동"), new User("10002", "호호호"));

    List<User> resultList = targetList.stream()
                            .filter(_this -> 
                            		filterList.stream().noneMatch(target -> _this.getId().equals(target.getId())))
                            .collect(Collectors.toList());

    System.out.println(resultList); // User[id=10001, name=홍길동]
}
  • 위 예제1에서 사용한 Predicate.isEqual이 아닌 User 객체의 필요한 값(id)를 불러서 사용해서 비교한다.
728x90
반응형