如何使用 RXJava 迭代两个数组并过滤数据?
How to iterate over two arrays and filter data using RXJava?
我使用 for 循环完成了以下代码。这将遍历三个数组并更新数组的内容。
for(MyPackage rPackage : rPackages){
for(Products product : rPackage.getProducts()){
for(SkuDetails skuItem : skuDetails){
if(product.getId().equals(skuItem.getSku())){
product.setSkuItem(skuItem);
break;
}
}
}
}
return rPackages;
可以使用 RXJava Observables 替换此迭代吗?
这种操作不推荐使用RxJava,但实际上反应式的方法并不比Stream-API.
慢多少
请看一下这个实现:
环境:
dependencies {
testCompile 'org.assertj:assertj-core:3.8.0'
testCompile("org.junit.jupiter:junit-jupiter-api:5.0.1")
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.0.1")
}
测试
@Test
void name3() {
Product product = new Product(1);
Product product1 = new Product(2);
Product product2 = new Product(3);
Product product3 = new Product(4);
Product product4 = new Product(5);
SkuDetail skuDetail1 = new SkuDetail(3);
SkuDetail skuDetail2 = new SkuDetail(5);
MyPackage myPackage =
new MyPackage(Arrays.asList(product, product1, product2, product3, product4));
List<Product> products =
Stream.of(skuDetail1, skuDetail2)
.map(
sku ->
myPackage
.products
.stream()
.filter(p -> p.id == sku.sku)
.findFirst()
.map(
p -> {
return new Product(
p.id); // create new product -> copy over all values
}))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
assertThat(products.size()).isEqualTo(2);
assertThat(products).extracting("id").contains(3);
assertThat(products).extracting("id").contains(5);
}
class MyPackage {
List<Product> products;
public MyPackage(List<Product> products) {
this.products = products;
}
}
class Product {
int id;
public Product(int id) {
this.id = id;
}
}
class SkuDetail {
int sku;
public SkuDetail(int sku) {
this.sku = sku;
}
}
我使用 for 循环完成了以下代码。这将遍历三个数组并更新数组的内容。
for(MyPackage rPackage : rPackages){
for(Products product : rPackage.getProducts()){
for(SkuDetails skuItem : skuDetails){
if(product.getId().equals(skuItem.getSku())){
product.setSkuItem(skuItem);
break;
}
}
}
}
return rPackages;
可以使用 RXJava Observables 替换此迭代吗?
这种操作不推荐使用RxJava,但实际上反应式的方法并不比Stream-API.
慢多少请看一下这个实现:
环境:
dependencies {
testCompile 'org.assertj:assertj-core:3.8.0'
testCompile("org.junit.jupiter:junit-jupiter-api:5.0.1")
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.0.1")
}
测试
@Test
void name3() {
Product product = new Product(1);
Product product1 = new Product(2);
Product product2 = new Product(3);
Product product3 = new Product(4);
Product product4 = new Product(5);
SkuDetail skuDetail1 = new SkuDetail(3);
SkuDetail skuDetail2 = new SkuDetail(5);
MyPackage myPackage =
new MyPackage(Arrays.asList(product, product1, product2, product3, product4));
List<Product> products =
Stream.of(skuDetail1, skuDetail2)
.map(
sku ->
myPackage
.products
.stream()
.filter(p -> p.id == sku.sku)
.findFirst()
.map(
p -> {
return new Product(
p.id); // create new product -> copy over all values
}))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
assertThat(products.size()).isEqualTo(2);
assertThat(products).extracting("id").contains(3);
assertThat(products).extracting("id").contains(5);
}
class MyPackage {
List<Product> products;
public MyPackage(List<Product> products) {
this.products = products;
}
}
class Product {
int id;
public Product(int id) {
this.id = id;
}
}
class SkuDetail {
int sku;
public SkuDetail(int sku) {
this.sku = sku;
}
}