当前位置: 首页 > 知识库问答 >
问题:

RxJava-获取列表中的每个项目

湛功
2023-03-14

我有一个方法返回一个可观察的

我将如何使用RxJava运算符做到这一点?


共有3个答案

仰钧
2023-03-14

使用一个可以修改源可观测值的转换器,在其上调用一个带有函数的flatMap。您可以将其视为一个两步过程:

  1. 该函数获取每个发出的项(一个Iterable)

变压器如下所示:

public class FlattenTransform<T> implements Observable.Transformer<Iterable<T>, T> {
    @Override
    public Observable<? extends T> call(Observable<? extends Iterable<T>> source) {
        return source.flatMap(new Func1<Iterable<T>, Observable<T>>() {
            @Override
            public Observable<T> call(Iterable<T> values) {
                return Observable.from(values);
            }
        });
    }
}

创建转换器后,可以使用compose将转换应用于源可观察对象:

public class Example {

    private static final ArrayList<Long> sourceList = new ArrayList<>(Arrays.asList(new Long[] {1L,2L,3L}));
    private static final Observable<ArrayList<Long>> listObservable = Observable.just(sourceList);
    private static final FlattenTransform<Long> flattenList = new FlattenTransform<Long>();

    public static void main(String[] args) {
        listObservable.compose(flattenList).subscribe(printItem);
    }

    private static Action1<Long> printItem = new Action1<Long>() {
        @Override
        public void call(Long item) {
            System.out.println("item: " + item);
        }
    };
}

使用带有变压器的撰写而不是带有Func1平面地图的优点是,如果将来您需要再次展平列表,您甚至不必考虑关于使用哪个运算符(map?平面地图?ConcatMap?)。换句话说,平面映射操作被烘焙到FlattenTransform类中,细节被抽象掉。

变压器还有其他好处,例如能够将多个操作链接在一起。

红智鑫
2023-03-14

作为flatMapIterable的替代方法,您可以使用flatMap执行此操作:

Observable.just(Arrays.asList(1, 2, 3)) //we create an Observable that emits a single array
            .flatMap(numberList -> Observable.fromIterable(numberList)) //map the list to an Observable that emits every item as an observable
            .flatMap(number -> downloadFoo(number)) //download smth on every number in the array
            .subscribe(...);


private ObservableSource<? extends Integer> downloadFoo(Integer number) {
   //TODO
}

就我个人而言,我认为

区别似乎是顺序(RxJava2):

  • Observable.fromIterable:将一个Iterable序列转换为一个可观测的源,该源将发出序列中的项。
  • Observable.flatMapIterable:返回一个可观测对象,该可观测对象将源可观测源发出的每个项与选择器生成的该项对应的Iterable中的值合并。

使用方法引用如下所示:

Observable.just(Arrays.asList(1, 2, 3))
            .flatMap(Observable::fromIterable)
            .flatMap(this::downloadFoo)

宦炜
2023-03-14

下面是一个独立的小例子

public class Example {

    public static class Item {
        int id;
    }

    public static void main(String[] args) {
        getIds()
                .flatMapIterable(ids -> ids) // Converts your list of ids into an Observable which emits every item in the list
                .flatMap(Example::getItemObservable) // Calls the method which returns a new Observable<Item>
                .subscribe(item -> System.out.println("item: " + item.id));
    }

    // Simple representation of getting your ids.
    // Replace the content of this method with yours
    private static Observable<List<Integer>> getIds() {
        return Observable.just(Arrays.<Integer>asList(1, 2, 3));
    }

    // Replace the content of this method with yours
    private static Observable<Item> getItemObservable(Integer id) {
        Item item = new Item();
        item.id = id;
        return Observable.just(item);
    }
}

请注意,是可观察的。只是(数组)。

这应该给你需要的基础。

p/s:对于这种情况使用flatMapIterable方法,因为它属于Iterable,如下所述:

/**
 * Implementing this interface allows an object to be the target of
 * the "for-each loop" statement. See
 * <strong>
 * <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides /language/foreach.html">For-each Loop</a>
 * </strong>
 *
 * @param <T> the type of elements returned by the iterator
 *
 * @since 1.5
 * @jls 14.14.2 The enhanced for statement
  */
 public interface Iterable<T>

 类似资料:
  • 我正在使用改造从REST服务获取数据。在接收json(对象列表)后,我想为列表上的每个位置获取位图。最好的方法是什么?我试图在改造后创建的可观察对象上使用地图/平面地图,但它不起作用(或者,可能是我做错了)。 改造接口方法: 使用方法: 当我试图使用平板地图()或地图()时,它总是返回一个列表,但我需要每个项目单独。 任何帮助都将不胜感激!

  • 问题内容: 我正在努力实现我认为在Rx中相当简单的东西。 我有一个项目列表,我想延迟每个项目的发出。 似乎Rx delay()运算符只是将所有项目的发射偏移指定的延迟,而不是每个单独的项目。 这是一些测试代码。它将列表中的项目分组。然后,每个组应在发出之前应用延迟。 结果是: 但是我希望看到的是这样的: 我究竟做错了什么? 问题答案: 一种方法是将可观察值与可观察值结合起来以延迟输出。

  • 我在玩RXJava,在Android系统中改装。我正在努力实现以下目标: 我需要定期调查一个电话,给我一个可观察的 一旦我得到这个列表,我想在每个交付迭代,并调用另一个方法,将给我的ETA(所以只是更多的信息)我想把这个新的信息附加到交付中,并返回完整的列表与附加到每个额外的信息项目。 一旦我得到了列表,我知道在没有rxjava的情况下如何做到这一点,但我想练习一下。 这是我目前的代码: 这是给我

  • 我使用改型2,我正在学习RxJava。我从某处下载了一个项目列表。我想对每个项目进行api调用,并创建扩展项目的新列表。两个调用都返回一个可观察的。它看起来像这样: 详细服务: } 问题是get细节返回一个可观察的,我不能用它来构造扩展项。在rxJava链中,更改get细节调用以返回对象不起作用,我猜是因为它将结果返回给主线程。如何获取对象本身?我尝试了很多其他的方法,但到目前为止都没有成功。

  • 如果您有这样的字符串: < code >【hello world】这是【最好的。家]是个好地方。 如何仅提取括号[]中的每个单词(由空格分隔)。现在我有这个工作 https://regex101.com/r/Tgokeq/2 哪个返回: 你好世界 最好的。家 但我想要: 你好 世界 该 最好的 。主页 PS:我知道我可以在一个foreach中做字符串拆分,但我不想要在正则表达式本身中使用它,就像这

  • 问题内容: 所以我查了一下,这个问题非常相似,但是它缺少一个关键点:SQL Server计算表的每一列中不同值的数量 因此,在这个问题中,他们希望每列的计数都不同。我想要做的是获取表中每个列的每个不同值的计数(而我正在为特定数据库中的所有表执行此操作,这就是为什么我要尝试尽可能地自动化这一点的原因尽可能)。当前,我的代码看起来像这样,我必须为每一列运行: 理想情况下,我的输出应如下所示: 以此类推