꾸준히 기록하자

[Java] distinct() 본문

IT/Java

[Java] distinct()

seungwonlee 2022. 12. 15. 17:23
728x90

먼저 distinct()를 설명하기 전에 저는 중복된 값이 포함될 수 있는 List에 중복이 있는지 확인하고 있으면 중복된 값을 반환해줘야 하는 코드를 작성해야 했었습니다. 그래서 어떤 식으로 코드를 작성할까 방법 찾다 보니 stream()에서 제공하는 distinct() 메서드를 알게 되어서 글을 쓰게 되었습니다.

 

distinct() 외 다른 방법으로도 코드를 작성할 수 있겠지만 저는 distinct()를 사용하여 작성하는 게 간결할 거 같았습니다.

 

코드 블록에 작성했었던 예제 코드를 구현해보겠습니다.

List<String> list = new ArrayList<String>();
list.add("짱구");
list.add("짱구");
list.add("철수");
list.add("철수");
list.add("맹구");
list.add("철수");

if (list.stream().distinct().count() != list.size()) {
    List<String> dpcnRemoveList = list.stream().distinct().collect(Collectors.toList());
    
    for (String value : dpcnRemoveList) {
        list.remove(value);
    }
    
    String dpcnName = String.valueOf(new HashSet<String>(list));
    System.out.println(dpcnName);
    // 결과: [철수, 짱구]
}

아래 코드 블록은 위 코드 블록에 대한 설명을 작성했습니다.

List<String> list = new ArrayList<String>();
list.add("짱구");
list.add("짱구");
list.add("철수");
list.add("철수");
list.add("맹구");
list.add("철수");

System.out.println(list.size()); // 결과: 6
System.out.println(list.stream().distinct().count()); // 결과: 3

// list에 중복된 값이 있으면 distinct().count()와 list.size의 값이 다릅니다.
if (list.stream().distinct().count() != list.size()) {

    // distinct()한 값을 collect(Collectors.toList())를 통해 새로운 컬렉션에 수집해 담습니다.
    List<String> dpcnRemoveList = list.stream().distinct().collect(Collectors.toList());
    
    System.out.println(dpcnRemoveList);
    // 결과: [짱구, 철수, 맹구]
    
    // dpcnRemoveList을 통해 list을 remove()하여 제거합니다.
    for (String value : dpcnRemoveList) {
        list.remove(value);
    }
    
    System.out.println(list);
    // 결과: [짱구, 철수, 철수]
    
    // 제거해도 남아 있는 값을 hashSet을 통해 중복을 제거합니다.
    String dpcnName = String.valueOf(new HashSet<String>(list));
    
    // 중복 값을 확인합니다.
    System.out.println(dpcnName);
    // 결과: [철수, 짱구]
}

* HashSet은 중복을 허용하지 않고 순서도 보장하지 않습니다.

 

distinct()를 간략하게 설명하면 stream()의 메서드들 중에 중복을 제거해 새로운 stream으로 반환해 주는 메서드입니다.

* stream()은 Java 8부터 지원하는 기능입니다.

* 스트림은 재사용이 불가능해 한번 정의해서 사용할 수 없습니다. 

 

끝.

반응형

'IT > Java' 카테고리의 다른 글

[Java] Call by Value & Reference  (0) 2023.01.15
[Java] Good Coding (PMD)  (0) 2022.12.27
[Java] Iterator()  (0) 2022.11.02
[Java] StringUtils.equals()  (0) 2022.09.15
[Java] contains()  (0) 2022.06.30
Comments