代码之家  ›  专栏  ›  技术社区  ›  Doctor Parameter

如何对满足过滤条件的mono结果执行操作

  •  0
  • Doctor Parameter  · 技术社区  · 6 年前

    我在和反应堆库里的mono打交道: https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html

    我想运行一个操作,在本例中,将testObject变异为包含test,只有满足条件时,test才是真的我试着用滤镜,但我不能让它做我想做的。我不希望mono的结果被修改,我希望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); 
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Simon Baslé    6 年前

    不使用 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);
    
        2
  •  -1
  •   Doctor Parameter    6 年前

    我最后用了作曲:

    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);