Java 生成通量<;结果>;从两个通量
我现在正在使用Java 生成通量<;结果>;从两个通量,java,reactive-programming,spring-webflux,Java,Reactive Programming,Spring Webflux,我现在正在使用Flux。我想从两个不同的对象创建一个Flux。我知道我必须使用双功能,但我不知道如何使用。 第一个对象对第一个对象具有PK和第二个FK。我要压缩PK=FK的对象 描述问题: 我有一个工作中的案例,我有一个房屋清单和一个我曾在其中的清单。我需要返回所有房屋的结果,我只会更改结果对象上的真/假标志。当然,第二个列表可能包含较少的元素 有人能提出这样或其他的建议吗 @RunWith(SpringRunner.class) @SpringBootTest public class Wh
Flux
。我想从两个不同的对象创建一个Flux
。我知道我必须使用双功能,但我不知道如何使用。
第一个对象对第一个对象具有PK和第二个FK。我要压缩PK=FK的对象
描述问题:
我有一个工作中的案例,我有一个房屋清单和一个我曾在其中的清单。我需要返回所有房屋的结果,我只会更改结果对象上的真/假标志。当然,第二个列表可能包含较少的元素
有人能提出这样或其他的建议吗
@RunWith(SpringRunner.class)
@SpringBootTest
public class WholesaleControllerTest {
@Test
public void testZipFlux() {
Flux<Flux1> flux1 = Flux.just(new Flux1(1, "test1"), new Flux1(2, "test2"), new Flux1(3, "test3"));
flux1.subscribe(item -> System.out.println("Flux1 " + item));
Flux<Flux2> flux2 = Flux.just(new Flux2(2, true), new Flux2(1, false), new Flux2(3, true));
flux2.subscribe(item -> System.out.println("Flux2 " + item));
Flux<Result> = ...//TODO zip flux1 and flux2 to RESULT
}
@Getter
@Setter
@AllArgsConstructor
class Flux1{
private int id;
private String value;
}
@Getter
@Setter
@AllArgsConstructor
class Flux2{
private int id_fk_flux2;
private boolean value;
}
@Getter
@Setter
@AllArgsConstructor
class Result{
private int id;
private String flux1Value;
private boolean flux2Value;
}
@RunWith(SpringRunner.class)
@春靴测试
公共级批发商控制测试{
@试验
公共无效测试Zipflux(){
通量flux1=通量.just(新的flux1(1,“test1”)、新的flux1(2,“test2”)、新的flux1(3,“test3”);
flux1.subscribe(item->System.out.println(“flux1”+item));
通量flux2=通量。just(新的flux2(2,真)、新的flux2(1,假)、新的flux2(3,真));
flux2.subscribe(item->System.out.println(“flux2”+item));
Flux=…//TODO zip flux1和flux2的结果
}
@吸气剂
@塞特
@AllArgsConstructor
Flux1类{
私有int-id;
私有字符串值;
}
@吸气剂
@塞特
@AllArgsConstructor
类Flux2{
私人内部id_fk_flux2;
私有布尔值;
}
@吸气剂
@塞特
@AllArgsConstructor
班级成绩{
私有int-id;
私有字符串flux1值;
私有布尔值;
}
}这是一种方法。但我必须说,这不是严格的反应式编程(因为我在第一个通量上使用块来创建一个映射) 话虽如此,我想不出别的办法
Map<Integer, Flux1> flux1Map = flux1.collectMap(Flux1::getId, Function.identity()).block();
Flux<Result> results = flux2.flatMap(item -> {
//TODO : Handle cases like key not found in flux1
Flux1 entry = flux1Map.get(item.getId_fk_flux2());
Result result = new Result(entry.getId(), entry.getValue(), item.isValue());
return Mono.just(result);
}).collectList().flatMapMany(Flux::fromIterable);
Map flux1Map=flux1.collectMap(flux1::getId,Function.identity()).block();
通量结果=flux2.flatMap(项目->{
//TODO:处理flux1中找不到密钥之类的情况
Flux1 entry=flux1Map.get(item.getId_fk_flux2());
结果=新结果(entry.getId()、entry.getValue()、item.isValue());
返回Mono.just(结果);
}).collectList().flatMapMany(通量::fromIterable);
你能用Flux.concat(flux1,flux2)
来做这些吗?@AntonBalaniuc不,concat可以工作,两种助焊剂的类型都是一样的。@Deluxx,恐怕你也不能用zipWith,因为两种助焊剂的顺序不同。所以,当你们在flux1和flux2中遇到第一个项目时,你们无法匹配我,尤其是我。我有一个工作中的案例,我有一个房屋清单和一个我曾在其中的清单。我需要返回所有房屋的结果,我只会更改result
对象上的真/假标志。当然,第二个列表可能包含较少的元素。还有别的办法吗?请你澄清一下你需要的担保吗?如果Flux没有具有普通pk的项目,你会怎么想?我有两个案例。1.如果不是,请设置特定值,例如false 2。如果没有,则不为结果创建新元素
我对block()
有问题,因为我有错误:block()/blockFirst()/blockLast()正在阻塞代码>检查此项,但这是块分辨率。根据您的要求,我必须创建非阻塞:/。。我认为这是不可能的。如果你能做到,请告诉我们。干杯