Java 如何对满足筛选条件的mono结果执行操作
我在和反应堆图书馆的Mono鬼混: 我想运行一个操作,在本例中,将testObject变为包含test,只有在满足条件的情况下,该操作才会为true。我正在尝试使用.filter执行此操作,但我无法让它完全执行我想要的操作。我不希望mono的结果被修改,我希望doOnNext运行对底层数据模型没有影响的东西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
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
是它的自然场所。