微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用过滤器 RX Java 进行热观察

如何解决使用过滤器 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 举报,一经查实,本站将立刻删除。