如何使用 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;
    }
  }