我有一个方法可以验证Stream中包含的一些元素。
例如,有一个序列有一系列数字(数字不重复),每个数字都比另一个大:
1, 20, 35, 39, 45, 43
... 有必要检查此流中是否存在指定范围,例如35。。。如果没有这样的范围,那么你需要抛出一个异常。
但由于这是异步处理,通常的方法在这里不起作用。毕竟,我们处理流中的元素,不知道下一个元素是什么。
该序列的元素需要折叠,添加应逐渐进行(一旦找到元素的初始范围)。
在服务期间,您需要检查生成的序列中是否存在endpoint,以及何时接收到整个元素流,但这一点不是,然后请求异常,因为未接收到指定范围的上限
此外,在找到指定范围的起点之前,不要开始计算,
虽然我们不能阻止流,否则我们将得到相同的Exstrong TextException。
如何组织这种检查?
当我使用常规线程时,它看起来是这样的:
private boolean isRangeValues() {
List<BigInteger> sequence = Arrays
.asList(
new BigInteger("11"),
new BigInteger("15"),
new BigInteger("23"),
new BigInteger("27"),
new BigInteger("30"));
BigInteger startRange = new BigInteger("15");
BigInteger finishRange = new BigInteger("27");
boolean isStartRangeMember = sequence.contains(startRange);
boolean isFinishRangeMembe = sequence.contains(finishRange);
return isStartRangeMember && isFinishRangeMember;
}
但是我有一个任务来处理以一定间隔生成的元素流。为了得到结果,在Spring中使用了Reactor栈,我在Flux中得到了结果。
只需转换为列表和进程,-它不会工作,会有异常。过滤完这些元素后,流将继续被处理。
但是如果我在过滤时看到数据验证中的错误(在这种情况下,不需要任何元素),那么我将需要请求异常,该异常将被全局处理并返回给客户端。
@GetMapping("v1/sequence/{startRange}/{endRange}")
Mono<BigInteger> getSumSequence(
@PathVariable BigInteger startRange,
@PathVariable BigInteger endRange) {
Flux<BigInteger> sequenceFlux = sequenceGenerated();
validateSequence(sequenceFlux)
return sum(sequenceFlux );
}
private Mono<BigInteger> sum (Flux<BigInteger> sequenceFlux ){
.....
}
private void validateSequence(Flux<BigInteger> sequenceFlux){
... is wrong
throw new RuntimeException();
}
}
我提出了一些解决方案(我在本主题中发表了它)。
public void validateRangeSequence(sequenceDto dto) {
Flux<BigInteger> sequenceFlux = dto.getSequenceFlux();
BigInteger startRange = dto.getStartRange();
BigInteger endRange = dto.getEndRange();
Mono<Boolean> isStartRangeMember = sequenceFlux.hasElement(startRange);
Mono<Boolean> isEndRangeMember = sequenceFlux.hasElement(endRange);
if ( !isStartRangeMember.equals(isEndRangeMember) ){
throw new RuntimeException("error");
}
但是它并没有像预期的那样工作,即使是正确的结果也会导致异常。
使现代化
public void validateRangeSeq(RangeSequenceDto dto) {
Flux<BigInteger> sequenceFlux = dto.getSequenceFlux();
BigInteger startRange = dto.getStartRange();
BigInteger endRange = dto.getEndRange();
Mono<Boolean> isStartRangeMember = sequenceFlux.hasElement(startRange);
Mono<Boolean> isEndRangeMember = sequenceFlux.hasElement(endRange);
sequenceFlux
.handle((number, sink) -> {
if (!isStartRangeMember.equals(isEndRangeMember) ){
sink.error(new RangeWrongSequenceExc("It is wrong given range!."));
} else {
sink.next(number);
}
});
}
sequenceFlux
.handle(((bigInteger, synchronousSink) -> {
if(!bigInteger.equals(startRange)){
synchronousSink.error(new RuntimeException("!!!!!!!!!!! ---- Wrong range!"));
} else {
synchronousSink.next(bigInteger);
}
}));
它的一段代码-它不起作用。(不以任何方式做出反应)
谁认为这是什么?应该这样做还是有其他方法?
我不熟悉Spring中的Reactor栈,也不知道如何处理这种情况。
也许有人对如何组织这样的过滤有想法,并且不会阻止流中元素的处理。
你可以试着这样做
Flux<Integer> yourStream = Flux.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).share();
Flux.zip(
yourStream.filter(integer -> integer.equals(4)),
yourStream.filter(integer -> integer.equals(6)),
(integer, integer2) -> Tuple2.of(integer, integer2))
.subscribe(System.out::println);
问题内容: 有什么方法可以检查一个集合是否包含一个或多个具有比使用contains循环两次更好的性能的值? 在其他意义上看起来像这样 问题答案: 循环的实现遍历每个元素并进行测试,因此调用两次 效率低下 。 您可以编写自己的循环,使用已编译的regex 模式同时检查两者,同时查找两个名称:
我要求用户在控制台写四个数字,每个数字用连字符分隔。然后我将它们拆分,这将自动创建一个列表,并将其转换为int。但我不知道用户输入了多少数字。 如何检查if方法中这个列表包含多少元素?我需要这样的东西: 我不需要建议来重建我的代码,我需要知道我是否可以检查它或不。
问题内容: 我可能在这里找不到一个简单的单行代码,但这是我的问题: 如何检查ArrayList是否包含另一个ArrayList中的所有对象?我正在寻找(如果存在的话)类似的东西: 例如: 问题答案: 接口中有一个声明的方法。在您的设置中给出所需的答案。
问题内容: 如何检查一个DOM元素是否是另一个DOM元素的子元素?有内置的方法吗?例如,类似: 要么 如果没有,那么有什么想法怎么做?它还需要跨浏览器。我还应该提到,孩子可以嵌套在父级以下的多个级别。 问题答案: 更新: 现在有一种本地方法可以实现此目的。。在评论中也提到了答案。 旧答案: 使用该属性应该可以。从跨浏览器的角度来看,它也是非常安全的。如果已知这种关系是一级的,则可以简单地检查一下:
问题内容: 使用普通的JavaScript(不是jQuery),是否可以检查元素是否 包含 类? 目前,我正在这样做: 问题是,如果我将HTML更改为此… …不再存在完全匹配的内容,因此我得到的默认输出为none()。但我还是想输出为,因为还 包含 了类。 问题答案: 使用方法: 这适用于所有当前浏览器,并且也有polyfill支持旧版本的浏览器。 或者 ,如果您使用较旧的浏览器,并且不想使用po
我有一个包含字符串的列。 (我以检查字符串是否在数据帧中为例) BabyDataSet=[(《鲍勃和马丁与安德鲁》,968)、(《杰西卡和茱莉亚与安东尼》,155)、(《玛丽和约翰》,77)、(《约翰》,578)、(《梅尔和黛安娜》,973)、(《马丁-鲍勃-黛安娜与安德鲁》,968)] a=pd.DataFrame(data=BabyDataSet,columns=['Names','natio