如何对满足过滤条件的单声道结果执行操作
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);
我正在使用 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);