如何对满足过滤条件的单声道结果​​执行操作

How to perform an action on the result of a mono which meets a filter condition

我正在使用 reactor 库中的 Mono:https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html

我想 运行 一个操作,在本例中,改变 testObject 以包含测试,只有满足条件时它才会为真。我正在尝试使用 .filter 来做到这一点,但我无法让它完全按照我的意愿去做。我不希望修改单声道的结果,我希望 doOnNext 到 运行 对底层数据模型没有影响的东西。

import org.junit.Assert;
import org.junit.Test;
import reactor.core.publisher.Mono;
import java.util.concurrent.atomic.AtomicReference;

/**
 * @author Doctor Parameter
 */
public class FilterTest {

    @Test
    public void test(){

        String test = "test";
        AtomicReference<String> testObject = new AtomicReference<>();

        //The filter is true
        testObject.set(null);
        String filterTrue = Mono.just(test)
                .filter(string -> string.equals(test))
                .doOnNext(string -> testObject.set(string))
                .block();
        Assert.assertEquals(test, testObject.get());
        Assert.assertEquals(test, filterTrue);

        //The filter is false
        testObject.set(null);
        String filterFalse = Mono.just(test)
                .filter(string -> string.equals("Something Else"))
                .doOnNext(string -> testObject.set(string))
                .block();
        Assert.assertEquals(null, testObject.get());
        Assert.assertEquals(test, filterFalse); //This fails, filterFalse == null

        //I can't do this, I don't have a reference to test in the real code. A valid answer can be how to get a reference within the Mono. 
        testObject.set(null);
        String filterFalse = Mono.just(test)
                .filter(string -> string.equals("Something Else"))
                .doOnNext(string -> testObject.set(string))
                .thenReturn(test)
                .block();
        Assert.assertEquals(null, testObject.get());
        Assert.assertEquals(test, filterFalse); 
    }
}

我最终使用了 compose:

String filterTrue = Mono.just(test)
    .compose(string -> string
        .filter(filterString -> filterString.equals(test))
        .doOnNext(nextString -> testObject.set(nextString))
        .then(string)
    ).block();
Assert.assertEquals(test, testObject.get());
Assert.assertEquals(test, filterTrue);

根本不使用 filter,这会在过滤器不匹配时从整个序列中删除数据。将整个副作用逻辑保持在 doOnNext:

    //The filter is false
    testObject.set(null);
    String filterFalse = Mono.just(test)
            .doOnNext(string -> {
              if (string.equals("Something Else"))
                  testObject.set(string);
             })   
            .block();
    Assert.assertEquals(null, testObject.get());
    Assert.assertEquals(test, filterFalse);