본문 바로가기

SpringWebflux

[SpringWebflux] Reactor operator - 3

728x90

집계 연산자

  • count
  • distinct
  • reduce
  • groupby

count

 

 

count: 송출되는 요소를 합쳐서 단일 값으로 전달하는게 count 입니다.

 

그림과 같이 4개의 요소가 전달되었을때 요소의 총 갯수인 4를 리턴합니다.

 

 

 

 

 

 

 

 

TestCode

public class Operator3 {
    // count
    public Mono<Long> fluxCount(){
        return Flux.range(1, 10).count().log();
    }
}

class Operator3Test {
    private Operator3 operator3 = new Operator3();
    @Test
    void fluxCount() {
        StepVerifier.create(operator3.fluxCount())
                .expectNext(10L)
                .verifyComplete();
    }
}

 

 

 

 

distinct

 

distinct: 중복값을 찾아서 없애주는 연산자입니다.

 

그림에서와 같이 여러 요소들이 전달될때, 녹색 동그라미의 경우 이미 전달되었기 때문에 전달되지 않습니다.

식별정보는 HashSet을 사용합니다.

 

 

 

 

 

TestCode

public class Operator3 {
    // distinct
    public Flux<String> fluxDistinct(){
        return Flux.fromIterable(List.of("a","b","a","b","c"))
                .distinct()
                .log();
    }
}

class Operator3Test {
    
    private Operator3 operator3 = new Operator3();
    
    @Test
    void fluxDistinct() {
        StepVerifier.create(operator3.fluxDistinct())
                .expectNext("a","b","c")
                .verifyComplete();
    }
}

 

 

 

 

reduce

 

reduce: 연속되는 숫자가 있다면 앞의 요소와 결합하여 하나의 값으로 계산하는 연산자 입니다.

 

스트림에서 모든 요소의 합을 계산할때 용이합니다.

 

 

 

 

 

 

 

 

 

 

TestCode

public class Operator3 {
    // reduce
    public Mono<Integer> fluxReduce(){
        return Flux.range(1,10)
                .reduce((i,j) -> i + j)
                .log();
    }
}

class Operator3Test {

    private Operator3 operator3 = new Operator3();
   
    @Test
    void fluxReduce() {
        StepVerifier.create(operator3.fluxReduce())
                .expectNext(55)
                .verifyComplete();
    }
}

 

 

 

groupby

 

groupby: 동일한 값 또는 특정값에 대해서 묶어서 처리할 수 있게 해주는 연산자입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

TestCode

public class Operator3 {
    // groupby
    public Flux<Integer> fluxGroupBy(){
        return Flux.range(1,10)
                .groupBy(i -> (i % 2 == 0) ? "even" : "odd")
                .flatMap(group -> group.reduce((i,j) -> i+j))
                .log();
    }
}

class Operator3Test {
    private Operator3 operator3 = new Operator3();
    @Test
    void fluxGroupBy() {
        StepVerifier.create(operator3.fluxGroupBy())
                .expectNext(30)
                .expectNext(25)
                .verifyComplete();
    }
}

 

 

728x90