Java

Java 8 Stream 불변 Collection

기록만이살길 2020. 6. 27. 02:04
반응형

# Java 8 Stream 불변 Collection

 

# **1. 소개**

 

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

 

# **2. 메이븐 의존성**

 

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

 

```java

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

 

```java

@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* 구현 클래스를 얻게 됩니다.

 

```java

@Test

public void whenCollectToImmutableList_thenSuccess() {

List<Integer> list = IntStream.range(0, 9)

.boxed()

.collect(ImmutableList.toImmutableList());

}

```

 

# **4. Guava's Collectors 사용 예제**

 

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

 

```java

@Test

public void whenCollectToImmutableList_thenSuccess() {

List<Integer> list = IntStream.range(0, 9)

.boxed()

.collect(ImmutableList.toImmutableList());

}

```

 

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

 

```xml

class com.google.common.collect.RegularImmutableList

```

 

# **5. Custom Collector 구축**

 

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

 

```java

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) . 그리고 그게 다야. 위의 방법은 사용자 정의 클래스의 일부입니다

 

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

 

```java

@Test

public void whenCollectToMyImmutableListCollector_thenSuccess() {

List<String> givenList = Arrays.asList("a", "b", "c", "d");

List<String> result = givenList.stream()

.collect(MyImmutableListCollector.toImmutableList());

}

```

 

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

 

```xml

class java.util.Collections$UnmodifiableRandomAccessList

```

 

# **5.1. *MyImmutableListCollector* 제네릭 만들기**

 

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

 

```java

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);

}

```

 

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

 

```java

@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* 를 사용하고 있습니다. 이것을 실행하고 결과를 보자.

 

```java

class java.util.Collections$UnmodifiableList

```

 

이 시간, 우리는 가지고 *UnmodifiableList* 대신 *UnmodifiableRandomAccessList을* .

 

# **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)

반응형