Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对满足筛选条件的mono结果执行操作_Java_Rx Java_Project Reactor - Fatal编程技术网

Java 如何对满足筛选条件的mono结果执行操作

Java 如何对满足筛选条件的mono结果执行操作,java,rx-java,project-reactor,Java,Rx Java,Project Reactor,我在和反应堆图书馆的Mono鬼混: 我想运行一个操作,在本例中,将testObject变为包含test,只有在满足条件的情况下,该操作才会为true。我正在尝试使用.filter执行此操作,但我无法让它完全执行我想要的操作。我不希望mono的结果被修改,我希望doOnNext运行对底层数据模型没有影响的东西 import org.junit.Assert; import org.junit.Test; import reactor.core.publisher.Mono; import java

我在和反应堆图书馆的Mono鬼混:

我想运行一个操作,在本例中,将testObject变为包含test,只有在满足条件的情况下,该操作才会为true。我正在尝试使用.filter执行此操作,但我无法让它完全执行我想要的操作。我不希望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); 
    }
}
import org.junit.Assert;
导入org.junit.Test;
导入reactor.core.publisher.Mono;
导入java.util.concurrent.AtomicReference;
/**
*@author-Doctor参数
*/
公共类过滤器测试{
@试验
公开无效测试(){
字符串test=“test”;
AtomicReference testObject=新的AtomicReference();
//过滤器是正确的
testObject.set(null);
字符串过滤器true=Mono.just(测试)
.filter(字符串->字符串.equals(测试))
.doOnNext(字符串->测试对象.set(字符串))
.block();
Assert.assertEquals(test,testObject.get());
Assert.assertEquals(test,filterTrue);
//过滤器是假的
testObject.set(null);
String filterFalse=Mono.just(测试)
.filter(字符串->字符串.equals(“其他内容”))
.doOnNext(字符串->测试对象.set(字符串))
.block();
Assert.assertEquals(null,testObject.get());
Assert.assertEquals(test,filterFalse);//此操作失败,filterFalse==null
//我不能这样做,我没有在真实代码中测试的引用。一个有效的答案可以是如何在Mono中获得引用。
testObject.set(null);
String filterFalse=Mono.just(测试)
.filter(字符串->字符串.equals(“其他内容”))
.doOnNext(字符串->测试对象.set(字符串))
.然后返回(测试)
.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);

我最终使用了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);

根本不要使用
过滤器
,这会在过滤器不匹配时从整个序列中删除数据。将整个副作用逻辑保持在
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);

根本不要使用
过滤器
,这会在过滤器不匹配时从整个序列中删除数据。将整个副作用逻辑保持在
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);

为什么要使用
过滤器
?第一个代码块对这个问题有什么影响?@abetteroliver第一个代码块是过滤器设置testObject的真实情况,第二个是过滤器不设置testObject的否定情况。我理解这一点,但我的观点是“false”代码块足以说明问题。公认的答案建立在我的第一个问题的基础上,我仍然想了解使用
过滤器
背后的原因。这种情况属于副作用,而不是流,因此
doOnNext
是它的自然场所。为什么要使用
过滤器
?第一个代码块对这个问题有什么影响?@abetteroliver第一个代码块是过滤器设置testObject的真实情况,第二个是过滤器不设置testObject的否定情况。我理解这一点,但我的观点是“false”代码块足以说明问题。公认的答案建立在我的第一个问题的基础上,我仍然想了解使用
过滤器
背后的原因。这种情况属于副作用,而不是流,因此
doOnNext
是它的自然场所。