Flux를 List로 변환, Map - Reactor

원본 게시물: https://bezkoder.com/reactor-flux-list-map/

이 튜토리얼에서는 collectList() , collectSortedList() , collectMap() , collectMultimap() 함수를 사용하는 예제로 Flux를 List/Map으로 변환하는 방법을 보여줍니다.

Flux를 Collection으로 변환하는 방법



다음과 같은 Flux 방법을 사용합니다.
  • collectList() : Mono<List> 에 시퀀스를 축적합니다.
  • collectSortedList() : 시퀀스를 누적하고 Mono<List> 로 정렬합니다.
  • collectMap() : 시퀀스를 Mono<Map> 로 변환합니다.
  • collectMultimap() : 시퀀스를 Mono<Map>로 변환하여 각 맵의 키가 다중 값과 ​​쌍을 이룰 수 있도록 합니다( Collection에서).

  • 그러면 위의 Mono 결과는 block() 메서드를 사용하여 실제 목록/맵으로 변환됩니다.

    Flux 선언 및 초기화



    Flux를 초기화하는 방법에는 여러 가지가 있습니다. 이 튜토리얼에서는 Flux.just() 함수를 사용하여 간단한 방법을 사용할 것입니다.

    Flux<String> flux = Flux.just(
                            "Site_0:bezkoder.com", 
                            "Description_0:Java Technology",
                            "Description_1:Project Reactor");
    


    Flux를 목록으로 변환



    플럭스 수집 목록()


    collectList() 시퀀스를 Mono<List> 에 누적한 다음 block() 메서드를 사용하여 Mono를 구독하고 다음 신호가 수신될 때까지 무기한 차단합니다.

    List<String> list1 = flux.collectList().block();
    list1.forEach(System.out::println);
    


    결과:

    Site_0:bezkoder.com
    Description_0:Java Technology
    Description_1:Project Reactor
    


    플럭스 수집 정렬 목록()


    collectSortedList() 시퀀스를 누적하고 Mono<List> 로 정렬한 다음 block() 메서드를 사용하여 Mono를 구독하고 차단합니다.

    List<String> list2 = flux.collectSortedList().block();
    list2.forEach(System.out::println);
    


    결과:

    Description_0:Java Technology
    Description_1:Project Reactor
    Site_0:bezkoder.com
    


    Flux를 맵으로 변환



    플럭스 수집 맵()



    함수 프로토타입:

    Mono<Map> collectMap(keyExtractor, valueExtractor)
    


    – 먼저 함수는 시퀀스를 Mono<Map> 로 변환합니다.
    – 마지막으로 Monoblock() 메서드에 의해 실제 List/Map이 됩니다.

    Map<String, String> map1 = flux
            .collectMap(
                    item -> item.split(":")[0], 
                    item -> item.split(":")[1])
            .block();
    map1.forEach((key, value) -> System.out.println(key + " -> " + value));
    


    결과:

    Site_0 -> bezkoder.com
    Description_1 -> Project Reactor
    Description_0 -> Java Technology
    


    플럭스 수집멀티맵()



    함수 프로토타입:

    Mono<Map<Object, Collection>> collectMultimap(keyExtractor, valueExtractor)
    

    collectMultimap() : 시퀀스를 Mono<Map>로 변환하여 각 맵의 키가 다중 값과 ​​쌍을 이룰 수 있도록 합니다( Collection에서).

    예를 들어, SiteDescription를 키로 사용하는 맵을 얻을 수 있습니다.

    Map<String, Collection<String>> map2 = flux
            .collectMultimap(
                    item -> item.split("_[0-9]+:")[0], 
                    item -> item.split(":")[1])
            .block();
    map2.forEach((key, value) -> System.out.println(key + " -> " + value));
    


    결과 확인:

    Site -> [bezkoder.com]
    Description -> [Java Technology, Project Reactor]
    


    구현



    기술



    – 자바 8
    – 메이븐 3.6.1
    – 2020.0.1 릴리스 트레인이 있는 Reactor Core 3.4.0.

    소스 코드



    package com.bezkoder.reactor;
    
    import java.util.Collection;
    import java.util.List;
    import java.util.Map;
    
    import reactor.core.publisher.Flux;
    
    public class FluxCollection {
        public static void main(String[] args) {
            Flux<String> flux = Flux.just("Site_0:bezkoder.com", "Description_0:Java Technology",
                    "Description_1:Project Reactor");
    
            System.out.println("=== flux.collectList() ===");
            List<String> list1 = flux.collectList().block();
            list1.forEach(System.out::println);
    
            System.out.println("\n=== flux.collectSortedList() ===");
            List<String> list2 = flux.collectSortedList().block();
            list2.forEach(System.out::println);
    
            System.out.println("\n=== flux.collectMap() ===");
            Map<String, String> map1 = flux
                    .collectMap(
                            item -> item.split(":")[0], 
                            item -> item.split(":")[1])
                    .block();
            map1.forEach((key, value) -> System.out.println(key + " -> " + value));
    
            System.out.println("\n=== flux.collectMultimap() ===");
            Map<String, Collection<String>> map2 = flux
                    .collectMultimap(
                            item -> item.split("_[0-9]+:")[0], 
                            item -> item.split(":")[1])
                    .block();
            map2.forEach((key, value) -> System.out.println(key + " -> " + value));
        }
    }
    

    결과

    === flux.collectList() ===
    Site_0:bezkoder.com
    Description_0:Java Technology
    Description_1:Project Reactor
    
    === flux.collectSortedList() ===
    Description_0:Java Technology
    Description_1:Project Reactor
    Site_0:bezkoder.com
    
    === flux.collectMap() ===
    Site_0 -> bezkoder.com
    Description_1 -> Project Reactor
    Description_0 -> Java Technology
    
    === flux.collectMultimap() ===
    Site -> [bezkoder.com]
    Description -> [Java Technology, Project Reactor]
    


    부록: Reactor 얻기



    Maven에서 Reactor 설치



    – 먼저 pom.xml에 다음을 추가하여 BOM을 가져옵니다.

    <dependencyManagement> 
        <dependencies>
            <dependency>
                <groupId>io.projectreactor</groupId>
                <artifactId>reactor-bom</artifactId>
                <version>2020.0.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    


    – 다음으로 종속성을 추가합니다.

    <dependencies>
      <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-core</artifactId>
      </dependency>
    </dependencies>
    


    Gradle에 Reactor 설치



    – 먼저 Gradle 플러그인 포털에서 플러그인을 적용합니다.

    plugins {
      id "io.spring.dependency-management" version "1.0.7.RELEASE" 
    }
    


    – 다음으로 종속성 관리를 사용하여 BOM을 가져옵니다.

    dependencyManagement {
      imports {
        mavenBom "io.projectreactor:reactor-bom:2020.0.1"
      }
    }
    


    – 마지막으로 종속성을 추가합니다.

    dependencies {
      implementation 'io.projectreactor:reactor-core' 
    }
    


    추가 읽기


  • Reactor 3 Reference Guide
  • Reactor Flux API
  • 좋은 웹페이지 즐겨찾기