簡體   English   中英

使用rxjava中的Observable序列進行一對多映射

[英]one to many mapping with a sequence of Observable in rxjava

給定一個源對象序列的Observable,如何使用rxjava將多個輸出對象映射到每個輸入對象之外? (一對多映射)

我有一份菜單清單,代表組成餐館訂單的物品。 我需要將每個Dish轉換為一個或多個OrderLine。 每個Dish地圖為其名稱+價格創建一個OrderLine,為每個Topping創建一個OrderLine,如果有注釋則創建一個OrderLine。

INPUT
List dishes = {...}

OUTPUT
List orderLines = {...}

class Dish {

  public String name;
  public List toppings;
  public String note;
  public BigDecimal price;

}

class Topping {

  public String name;
  public BigDecimal price;

}

class OrderLine {

  public String name;
  public BigDecimal price;

}

有沒有辦法使用函數式編程和/或反應式編程?

我不想使用必要的東西,例如:


List orderLines = new ArrayList();
for (Dish dish : dishes) {

   orderLines.add(new OrderLine(dish.name, dish.price);

   for (Topping topping : dish.toppings) {
      orderLines.add(new OrderLine(topping.name, topping.price);
   }

   if(note != null) {
      orderLines.add(new OrderLine(dish.note, "");
   }

}

相反,我想做這樣的事情:

Observable.from(dishes).map( /* map each dish to many OrderLine */ ).

您正在尋找的是flatMap 它在流上運行,輸出其他Observable。

這里是關於map()flatMap()的討論 ,但更重要的是這里是一個例子(在完整的Java 7中):

Observable.from(dishes)
    .flatMap(new Func1<Dish, Observable<OrderLine>>() {
        @Override
        public Observable<OrderLine> call(Dish dish) {
            List<OrderLine> orderLines = new ArrayList<>();
            orderLines.add(new OrderLine(dish.name, dish.price);

            for (Topping topping : dish.toppings) {
                orderLines.add(new OrderLine(topping.name, topping.price);
            }

            if(dish.note != null) {
                orderLines.add(new OrderLine(dish.note, "");
            }
            return Observable.from(orderLines);
        }
    })
    .subscribe(new Action1<OrderLine>() {
        @Override
        public void call(OrderLine orderLine) {
            ...
        }
    });

您可能希望將Dish-to-OrderLine功能繪制到另一種方法中,以便您可以對其進行測試,這將使這更加簡潔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM