gpt4 book ai didi

java - 链式 Observable

转载 作者:搜寻专家 更新时间:2023-11-01 03:17:59 30 4
gpt4 key购买 nike

我有一个对象集合,称它们为obj。他们有一个 act() 方法。 act() 方法最终会导致 o 上的 event() observable 调用 onComplete

链接这些的好方法是什么?

即调用o.act(),等待o.event().onComplete后再调用下一个o2.act(),依此类推集合中无限数量的 o

所以签名是这样的:

public class Item {
final protected PublishSubject<Object> event = PublishSubject.create();

public Observable<ReturnType> event() {
return event;
}

public void act() {
// do a bunch of stuff
event.onComplete();
}
}

然后在消费代码中:

Collection<Item> items...
foreach item in items
item.act -> await item.event().onComplete() -> call next item.act() -> so on

最佳答案

如果我没理解错的话,你的对象有这样的签名:

public class Item {
public Observable<ReturnType> event()...
public ReturnType act()...
}

所以如果他们像这样填写:

public class Item {

private final String data;
private final Observable<ReturnType> event;

public Item(String data) {
this.data = data;

event = Observable
.fromCallable(this::act);
}

public Observable<ReturnType> event() {
return event;
}

public ReturnType act() {
System.out.println("Item.act: " + data);
return new ReturnType();
}
}

然后它们可以像这样链接起来:

Item item1 = new Item("a");
Item item2 = new Item("b");
Item item3 = new Item("c");

item1.event()
.concatWith(item2.event())
.concatWith(item3.event())
.subscribe();

结果:

Item.act: a
Item.act: b
Item.act: c

然后如果你有一个 Iterable 集合,你可以使用 flatMap:

Iterable<Item> items = Arrays.asList(item1, item2, item3);

Observable.from(items)
.flatMap(Item::event)
.subscribe();

备选

更像您的情况的替代方案可能是:

public class Item {
private final PublishSubject<Void> event = PublishSubject.create();

private final String data;

public Item(String data) {
this.data = data;
}

public Observable<Void> event() {
return event;
}

public Void act() {
System.out.println("Item.act: " + data);
// do a bunch of stuff
event.onCompleted();
return null;
}
}

用法:

Iterable<Item> iterable = Arrays.asList(item2, item3);

item1.event().
concatWith(Observable.from(iterable)
.map(Item::act))
.subscribe();

item1.act();

但它不会在项目 2 之后使用 event()

关于java - 链式 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41416149/

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