rx-java2 - 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
实例。有任何想法吗?
解决方案
为什么不使用这种简单的方法:
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()));
}
推荐阅读
- reactjs - 如何在 React Native 中将元素放置在底部选项卡导航器上
- r - 将多个大小不等的数据框中的条目相加,其中一些(但不是全部)行和列相同
- python - 使用 OpenCV 捕获当前帧
- rest - CL_HTPP_CLIENT 代码 400 错误请求 - ABAP
- javascript - 如何使vue firebase调用异步
- schedule - 如何根据数据准确性评估我的软件输出?
- c - 编译 Win32 应用程序时对“StringCbPrintfW”的未定义引用
- json - 使用riverpod通过http从json获取数据的问题
- javascript - 我想比较对象的 JSON 数组中的内部数组并使用 JavaScript 根据条件返回新数组
- azure - Azure 服务总线 - 随机反序列化问题