title: Return Mono.empty() if a value is found but without executing other steps
body: <p>This problem is very hard to describe as text, so if the title doesn't fit the requirement, sorry for that.</p>
  
  <p>I would like to achieve a specific goal with Project Reactor flux and mono, which seems to be pretty simple at first look. </p>
  
  <p>A code example, in the "blocking-way" will be better than a long description: </p>
  
  <pre><code>    fun findGroupToCreateBlocking(userId: UUID, groupLabel: String): Optional&lt;LinkUserToGroup&gt; {
          val group = lib.findGroupsOfUser(userId)
                  .flatMapIterable { it.items }
                  .filter { it.label == groupLabel }
                  .toMono()
                  .blockOptional()
  
          if(group.isPresent) {
              return Optional.empty()
          }
  
          return lib.searchGroups(groupLabel)
                  .flatMapIterable { it.items }
                  .filter { it.label == groupLabel }
                  .toMono()
                  .map { LinkUserToGroup(userId, it.id) }
                  .switchIfEmpty { IllegalStateException("Group $groupLabel not found").toMono() }
                  .blockOptional()
      }
  </code></pre>
  
  <p>I try to achieve the same thing without the <code>block</code> part of course. I ended up with the following code: </p>
  
  <pre><code>fun findGroupToCreateReactive(userId: UUID, groupLabel: String): Mono&lt;LinkUserToGroup&gt; =
              lib.findGroupsOfUser(userId)
                      .flatMapIterable { it.items }
                      .filter { it.label == groupLabel }
                      .toMono()
                      .map { Optional.of(it) }
                      .defaultIfEmpty(Optional.empty())
                      .filter { g -&gt; g.isEmpty }
                      .flatMap { lib.searchGroups(groupLabel)
                              .flatMapIterable { it.items }
                              .toMono()
                              .map { LinkUserToGroup(userId, it.id) }
                              .switchIfEmpty { IllegalStateException("Group $groupLabel not found").toMono() }
                      }
  </code></pre>
  
  <p>I think (and I'm not the only one ) we can do better and not rely on the <code>Optional</code> usage in the middle of the stream... but I didn't find any other solution. </p>
  
  <p>This is the fourth time I fight against this "pattern", so some help would be welcomed! </p>
  
  <p>I've generated a demo project on Gitlab (<a href="https://gitlab.com/davinkevin/reactor-problem-i-cant-solve" rel="nofollow noreferrer">here</a>) with unit tests for bot reactive and blocking implementation to see if the proposition match the requirement. If you want, you can fork and use the project. </p>