首页 > 解决方案 > RxJava2:调用 Flowable.toList 时处理空值

问题描述

我有以下要求:遍历一个数组并为每个元素发出一个方法,该方法有时可以返回Optional.empty并最终将所有内容收集到一个最终列表中,每个列表都Optional.empty将与null.

public class ListWithNullsTest
{
  @Test
  public void testListWithNulls() throws Exception
  {
    generateList(new Integer[] { 1, 2, 3, 4, 5 }) //
        .subscribe( //
            results -> {
              System.out.println(results);
            }, //
            Throwable::printStackTrace //
        );
  }

  private Single<List<Integer>> generateList(Integer[] list)
  {
    return Flowable.fromArray(list) //
        .concatMapSingle(item -> {
          return doSomething(item);
        }) //
        .toList() //
        .map(listWithOptionals -> {
          return listWithOptionals.stream().map(item -> {
            return item.orElseGet(() -> null);
          }).collect(Collectors.toList());
        });
  }

  private Single<Optional<Integer>> doSomething(Integer item)
  {
    if (item % 2 == 0)
    {
      return Single.just(Optional.of(item));
    }

    return Single.just(Optional.empty());
  }
}

结果

Input: [1,2,3,4,5]
Output: [null,2,null,4,null]

我正在尝试找到一种更好的方法,因此我不需要创建临时Optional.empty实例。有任何想法吗?

标签: rx-java2

解决方案


为什么不使用这种简单的方法:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5 );
List<Integer> transformList = list.stream()
      .map(item -> (item % 2 == 0) ? item : null)
      .collect(Collectors.toList());

System.out.println(transformList);

更新

您的解决方案是正确的,并提供您想要的。我不太明白你想在哪里找到“更好的方法”。您可以更好地格式化它并使用orElse而不是orElseGet

private Single<List<Integer>> generateList(Integer[] list) {
    return Flowable.fromArray(list)
            .concatMapSingle(item -> doSomething(item))
            .toList()
            .map(listWithOptionals -> listWithOptionals.stream()
                    .map(item -> item.orElse(null))
                    .collect(Collectors.toList()));
}

推荐阅读