Java 8 Stream 불변 Collection

Java 8 Stream 불변 Collection

1. 소개

이 빠른 기사에서는 Java *Streams* 를 변경 불가능한 *콜렉션* 으로 수집하는 다양한 방법을 살펴볼 것입니다. 표준 *콜렉터* 는 변경 가능한 데이터 구조에서만 작동 하기 때문에 특별한 접근 방식이 필요합니다 .

2. 메이븐 의존성

Google의 구아바 라이브러리를 사용하여 몇 가지 예를 살펴 보겠습니다.

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>22.0</version>
</dependency>

[여기](https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.google.guava%22%20AND%20a%3A%22guava%22) 에서이 종속성의 최신 버전을 얻을 수 [있습니다](https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.google.guava%22%20AND%20a%3A%22guava%22) .

3. Java의 collectAndThen () 사용

*collectingAndThen ()* 자바의에서 방법 *수집기* 클래스는 받아 *수집* 및 *피니셔 기능* 으로부터 반환 된 결과에 적용되는 *수집기 :*

@Test
public void whenUsingCollectingToImmutableList_thenSuccess() {
    List<String> givenList = Arrays.asList("a", "b", "c");
    List<String> result = givenList.stream()
    .collect(collectingAndThen(toList(), ImmutableList::copyOf));
    System.out.println(result.getClass());
}

우리가 toCollection를 사용할 수 없기 때문에 수집기는 직접, 우리는 임시 목록을 수집 요소를 필요로하고 그것에서 불변의리스트를 구성.

이 예제에서는 toList 수집기를 사용하여 Stream을 List로 변환 한 다음 ImmutableList를 만듭니다 . ImmutableList는 구아바 라이브러리의 일부입니다. 출력을 콘솔에 기록하면 기본 클래스를 얻습니다.

출력을 콘솔에 기록하면 기본 List 구현 클래스를 얻게 됩니다.

@Test
public void whenCollectToImmutableList_thenSuccess() {
    List<Integer> list = IntStream.range(0, 9)
    .boxed()
    .collect(ImmutableList.toImmutableList());
}

4. Guava's Collectors 사용 예제

Guava 21부터 모든 불변 클래스에는 표준 수집기 만큼 사용하기 쉬운 수집기가 함께 제공됩니다.

@Test
public void whenCollectToImmutableList_thenSuccess() {
    List<Integer> list = IntStream.range(0, 9)
    .boxed()
    .collect(ImmutableList.toImmutableList());
}

결과 인스턴스는 RegularImmutableList입니다.

class com.google.common.collect.RegularImmutableList

5. Custom Collector 구축

이제 한 단계 더 나아가 사용자 정의 수집기를 구현해 보겠습니다 . 이 목표를 달성하기 위해 정적 Collector.of () 메소드 를 사용합니다 .

public static <T> Collector<T, List<T>, List<T>> toImmutableList() {
    return Collector.of(ArrayList::new, List::add,
        (left, right) -> {
        left.addAll(right);
        return left;
        }, Collections::unmodifiableList);
}

사용자 정의 수집기 구현에 대한 자세한 내용 은 [이 기사의](https://www.baeldung.com/java-8-collectors) 섹션 4를 [참조하십시오](https://www.baeldung.com/java-8-collectors) . 그리고 그게 다야. 위의 방법은 사용자 정의 클래스의 일부입니다

다른 내장 수집기 와 마찬가지로 이제 사용할 수 있습니다 .

@Test
public void whenCollectToMyImmutableListCollector_thenSuccess() {
    List<String> givenList = Arrays.asList("a", "b", "c", "d");
    List<String> result = givenList.stream()
    .collect(MyImmutableListCollector.toImmutableList());
}

마지막으로 출력을 확인하십시오.

class java.util.Collections$UnmodifiableRandomAccessList

5.1. MyImmutableListCollector 제네릭 만들기

구현에는 한 가지 제한 사항이 있습니다. 항상 ArrayList가 지원하는 불변 인스턴스를 반환합니다 . 그러나 약간의 개선으로이 콜렉터가 사용자 지정 유형을 리턴하도록 만들 수 있습니다.

public static <T, A extends List<T>> Collector<T, A, List<T>> toImmutableList(
Supplier<A> supplier) {
    return Collector.of(
        supplier,
        List::add, (left, right) -> {
        left.addAll(right);
        return left;
        }, Collections::unmodifiableList);
}

이제 메소드 구현에서 공급 업체 를 결정하는 대신 사용자에게 공급 업체 를 요청합니다 .

@Test
public void whenPassingSupplier_thenSuccess() {
    List<String> givenList = Arrays.asList("a", "b", "c", "d");
    List<String> result = givenList.stream()
    .collect(MyImmutableListCollector.toImmutableList(LinkedList::new));
}

우리는 이제 ArrayList 대신 LinkedList 를 사용하고 있습니다. 이것을 실행하고 결과를 보자.

class java.util.Collections$UnmodifiableList

6. 결론

이 짧은 기사에서 Stream을 불변 컬렉션으로 수집하는 다양한 방법을 보았습니다 .

이 기사의 전체 소스 코드 [를 GitHub에서](https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-streams-2) 확인하십시오 .

참고

[https://www.baeldung.com/java-stream-immutable-collection#using-javas-collectingandthen](https://www.baeldung.com/java-stream-immutable-collection#using-javas-collectingandthen)

Last updated

Was this helpful?