如何解决使用过滤器 RX Java 进行热观察
我正在尝试在 register 方法中创建一个带有 过滤 的热可观察对象,作为实现基本接口的事件列表,如下所示:
public void register(Observer<AppEvent> observer,List<AppEvent> filter) {
Log.d(TAG,"Registering observer");
subject.subscribeOn(Schedulers.io())
.filter(o -> {
return filter.stream().anyMatch(it -> (o instanceof it));
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public interface AppEvent extends Serializable {
}
public static class ItemDetails implements AppEvent {
public String info;
public ItemDetails(String malwareInfo) {
info = malwareInfo;
}
}
public static class InitApi implements AppEvent {
public Boolean isSuccess;
public InitApi(boolean isSuccess) {
this.isSuccess = isSuccess;
}
}
我想要做的是根据事件类的类型创建一个过滤器,在我们的例子中是 ItemDetails 或 InitApi。 逻辑上代码是正确的:
.filter(o -> {
return filter.stream().anyMatch(it -> (o instanceof it));
})
但编译器说 unkNown class it
。
如何过滤 AppEvent 列表?
解决方法
如评论中所述,您看到编译器错误,因为 instanceof
运算符要求右侧参数是类或接口。
如果您尝试创建一个“允许”的事件列表以传递给 Observer
,您可以执行以下操作:
public void register(Observer<AppEvent> observer,List<AppEvent> filter) {
Log.d(TAG,"Registering observer");
// Collect the names of events to pass on to the observer
final List<String> allowedEventNames = filter.stream()
.map(it -> it.getClass().getName())
.collect(Collectors.toList());
subject.subscribeOn(Schedulers.io())
// Filter based on names
.filter(event -> allowedEventNames.contains(event.getClass().getName()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。