기본적인 중복 제거는 아래와 같이 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);
}