RxJava操作符实践:11_转换操作之2_toFuture

一、描述

这个操作符将Observable转换为一个返回单个数据项的Future。

toFuture操作符也是只能用于BlockingObservable。这个操作符将Observable转换为一个返回单个数据项的Future,如果原始Observable发射多个数据项,Future会收到一个IllegalArgumentException;如果原始Observable没有发射任何数据,Future会收到一个NoSuchElementException。

如果你想将发射多个数据项的Observable转换为Future,可以这样用:myObservable.toList().toBlocking().toFuture()。

二、示意图

toFuture

三、示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
Future future = Observable.just(1).toBlocking().toFuture();

try {
System.out.println("Data: " + future.get());
} catch (NoSuchElementException e) {
System.out.println("Error: " + e.getCause());
} catch (IllegalArgumentException e) {
System.out.println("Error: " + e.getCause());
} catch (InterruptedException e) {
System.out.println("Error: " + e.getCause());
} catch (ExecutionException e) {
System.out.println("Error: " + e.getCause());
}

四、运行结果

1
Data: 1

五、更多

1. 发射多个数据项(异常处理)

1
2
3
4
5
6
7
8
9
10
11
12
13
Future future = Observable.just(1, 2, 3, 4, 5).toBlocking().toFuture();

try {
System.out.println("Data: " + future.get());
} catch (NoSuchElementException e) {
System.out.println("Error: " + e.getCause());
} catch (IllegalArgumentException e) {
System.out.println("Error: " + e.getCause());
} catch (InterruptedException e) {
System.out.println("Error: " + e.getCause());
} catch (ExecutionException e) {
System.out.println("Error: " + e.getCause());
}

运行结果

1
Error: java.lang.IllegalArgumentException: Sequence contains too many elements

可见当原始Observable发射多个数据项,Future会收到一个IllegalArgumentException。

2. 发射多个数据项(正确处理)

如果你想将发射多个数据项的Observable转换为Future,可以这样用:myObservable.toList().toBlocking().toFuture()。

1
2
3
4
5
6
7
8
9
10
11
12
13
Future future = Observable.just(1, 2, 3, 4, 5).toList().toBlocking().toFuture();

try {
System.out.println("Data: " + future.get());
} catch (NoSuchElementException e) {
System.out.println("Error: " + e.getCause());
} catch (IllegalArgumentException e) {
System.out.println("Error: " + e.getCause());
} catch (InterruptedException e) {
System.out.println("Error: " + e.getCause());
} catch (ExecutionException e) {
System.out.println("Error: " + e.getCause());
}

运行结果

1
Data: [1, 2, 3, 4, 5]

3. 不发射任何数据

1
2
3
4
5
6
7
8
9
10
11
12
13
Future future = Observable.empty().toBlocking().toFuture();

try {
System.out.println("Data: " + future.get());
} catch (NoSuchElementException e) {
System.out.println("Error: " + e.getCause());
} catch (IllegalArgumentException e) {
System.out.println("Error: " + e.getCause());
} catch (InterruptedException e) {
System.out.println("Error: " + e.getCause());
} catch (ExecutionException e) {
System.out.println("Error: " + e.getCause());
}

运行结果

1
Error: java.util.NoSuchElementException: Sequence contains no elements

可见原始Observable没有发射任何数据,Future会收到一个NoSuchElementException。

六、参考资料

ReactiveX官方文档

ReactiveX文档中文翻译

PS:欢迎关注 SherlockShi 个人博客

感谢你的支持,让我继续努力分享有用的技术和知识点!