쩨이엠 개발 블로그

[ Java ] java8 list 비교 본문

개발/JAVA

[ Java ] java8 list 비교

쩨이엠 2020. 6. 4. 11:27
728x90
반응형

 

요즘 stream 쓰는게 재밌다

뭔가 코드 간결해보이고(그렇진 않지만)

더 성능 좋아보이고 (그것도 아니지만)

 

그래서 이번에도 stream을 써서 list를 비교해보기로 했다

 

이번에 내가 해야할 일은 두 개의 List를 비교하여 있던건 추가하고 없던건 제거할 예정이다

 

@Test
void testData(){
    List<String> targetList = Arrays.asList("a1", "a2", "a3", "a4");
    List<String> filterList = Arrays.asList("a3", "a4", "a5", "a6");
    List<String> filteredList = targetList.stream()
		.filter(target -> filterList.stream().noneMatch(Predicate.isEqual(target)))
		.collect(Collectors.toList());


    System.out.println(filteredList); //[a1, a2]

    List<String> filteredTargetList = filterList.stream()
		.filter(target -> targetList.stream().noneMatch(Predicate.isEqual(target)))
		.collect(Collectors.toList());

    System.out.println(filteredTargetList); //[a5, a6]


}

String 타입의 list를 비교하기 위해서 이번에 쓴 함수는 noneMatch

저렇게 보면 뭔가 잘되는것같다 싶지만 사실 이중포문 도는걸 좀 형식을 바꾼거라 ㅋㅋㅋㅋㅋ

그래서 한큐에 끝나니까 잘되는것같기도하고?? ㅋㅋㅋㅋ

 

 

리스트 안에 들어간 타입이 String이라 Predicate.isEqual을 써도 비교가 가능했지만 만약 String이 아닌 Object라면?

 

@Builder
@Data
public static class TestData{
	private String id;
	private String value;
}

이런 TestData 생성자를 만들어본다

 

id와 value값을 설정한 뒤 돌리면 리스트 비교가 되지 않는다

 

난 id 하나만을 비교하고 싶다면??

 

@Test
void testData(){
    List<TestData> targetList = Arrays.asList(TestData.builder().id("a1").value("a1").build(), TestData.builder().id("a2").value("a1").build());
    List<TestData> filterList = Arrays.asList(TestData.builder().id("a3").value("a3").build(), TestData.builder().id("a2").value("a2").build());

    System.out.println(filteredList);
    List<TestData> filteredTargetList = filterList.stream()
        .filter(filter -> targetList.stream()
        	.noneMatch(target ->filter.getId().equals(target.getId())))
		.collect(Collectors.toList());

    System.out.println(filteredTargetList);

}

 

이런식으로 Predicate.isEqual 대신에 id만 불러서 비교해주면 간단하게 끝!

 

 

 

콘솔 화면

[ApplicationTests.TestData(id=a1, value=a1)]
[ApplicationTests.TestData(id=a3, value=a3)]
728x90
반응형
Comments