gpt4 book ai didi

java - 在 rxjava 中使用一系列 Observable 进行一对多映射

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:09 25 4
gpt4 key购买 nike

给定一个源对象序列的 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。

Here's a discussion on map() vs 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 功能绘制到另一个方法中以便对其进行测试,这将使整个过程更加简洁。

关于java - 在 rxjava 中使用一系列 Observable 进行一对多映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29672476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com