본문 바로가기

Programming!

Stream 내 값에 대한 Distinct 처리

기본적인 중복 제거는 아래와 같이 distinct() 를 사용하는 것이다. 편하네..

List<String> distinctNames = Arrays.asList("닉", "그리썸", "이블린", "그리썸", "호라시오", "맥", "이블린").stream().distinct().collect(Collectors.toList());
log.debug("DistinctNames = {}", distinctNames);

 

특정 오브젝트에 속성 값을 distinct() 할 경우는 아래와 같이 별도의 function을 만들어 처리한다.

User.java

@Getter
@Setter
@Builder
@ToString
class User {
	private String name;
	@Default
	private int age = 0;
}

StreamDistinct.java (별도로만..)

public static <T> Predicate<T> distinctByKey(Function<? super T, ?> attributeKey) {
	Set<Object> seen = ConcurrentHashMap.newKeySet();
	return t -> seen.add(attributeKey.apply(t));
}

 

Test

@Test
public void test_Distinct2(){
	List<User> users = Lists.newArrayList(User.builder().name("닉").build(), User.builder().name("그리썸").build(), User.builder().name("닉").build());
	List<User> distinctUsers = users.stream().filter(distinctByKey(User::getName)).collect(Collectors.toList());
	log.debug("DistinctNames = {}", distinctUsers);
}