18

Is it possible to get the first element from flux without converting flux into stream?

Amadeu Antunes
  • 678
  • 1
  • 8
  • 28
akreddy.21
  • 626
  • 3
  • 8
  • 21

3 Answers3

24

Alternatively to take(1), if you need a Mono<T> that represents the first element of the Flux<T> you can use .next().

Or if you need the i-th element, use .elementAt(i) (must be sure that such an element exists though, unlike take and next which just return an empty publisher if not enough elements).

Simon Baslé
  • 27,105
  • 5
  • 69
  • 70
  • 1
    Thanks @Simon for you reply. I idea here is to sort the Flux first and then get the first element. After seeing the docs I can achieve the same by using reduce on the flux as below. Flux.just(1, 2, 3) .reduce((o1, o2) -> { if (o1 - o2 < 0) { return o1; } return o2; }) – akreddy.21 Mar 07 '19 at 06:18
4

Flux.range(1,10).take(1) should do the trick (the range(...) part here is only to emit some sample values; if you blockFirst() or subscribe() to the stream, you should see '1')

Mikhail Kholodkov
  • 23,642
  • 17
  • 61
  • 78
Frischling
  • 2,100
  • 14
  • 34
0

Also the easiest: you can convert your Flux to Mono using Mono.from()

Mono<T> mono = Mono.from(flux);

It takes the first element of flux or completes with empty if flux has not emitted any element.

kerbermeister
  • 2,985
  • 3
  • 11
  • 30