본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)

JAVA List 중복제거, distinct (stream과 Function을 활용)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 8. 6.

 

자바 1.8을 활용한 데이터 중복제거 방법 입니다.

List가 포함하는 데이터는 HashMap으로 하였습니다.

물론, 사용자가 만든 vo 객체를 사용해도 무방하며, 일반 String, Integer, float, char 등 다른 자료형태도 가능합니다.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class FunctionTest {

    public static void main(String[] args) {
        List<HashMap<Object, Object>> list = new ArrayList<HashMap<Object,Object>>();

        HashMap<Object, Object> item = new HashMap<Object, Object>();
        item.put("day", "2019-08-06");
        item.put("name", "hello");
        item.put("data", "1234");
        list.add(item);

        item = new HashMap<Object, Object>();
        item.put("day", "2019-08-07");
        item.put("name", "good");
        item.put("data", "1234");
        list.add(item);

        item = new HashMap<Object, Object>();
        item.put("day", "2019-08-08");
        item.put("name", "hello");
        item.put("data", "1010");
        list.add(item);

        List<HashMap<Object, Object>> result = distinctArray(list, "name");
        result.forEach(System.out::println);

    }

    //중복제거 메소드, key는 제거할 맵 대상
    public static List<HashMap<Object, Object>> distinctArray(List<HashMap<Object, Object>> target, Object key){ 
        if(target != null){
            target = target.stream().filter(distinctByKey(o-> o.get(key))).collect(Collectors.toList());
        }
        return target;
    }

    //중복 제거를 위한 함수
    public static <T> Predicate<T> distinctByKey(Function<? super T,Object> keyExtractor) {
        Map<Object,Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
}

 

일반 stream 객체를 가져오면 단순하게 distinct만 존재 합니다.

해당 메소드는 데이터 형태를 전부 비교해서 제거하기 때문에 위 내용처럼 Map형태로 된 특정 값을 기준으로 제거하는 경우에는 동작하지가 않습니다.

 

따라서 위 코드처럼 함수식을 활용하면 데이터들 제거할 수 있습니다.

물론 1.8 이하 버전에서는 당연히 동작하지 않습니다.

 

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글