[英]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.