# 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)
'Java' 카테고리의 다른 글
JAR 파일 내 클래스 이름 가져오기 (0) | 2021.09.20 |
---|---|
Keycloak의 로그인 페이지 사용자 정의 (0) | 2021.09.20 |
Java 8 groupingBy Collector 예제 (1) | 2020.06.25 |
Java 8 Collectors 베스트 예제 (0) | 2020.06.24 |
Java 8 Functional Interfaces (0) | 2020.06.22 |