使用响应式编程的简单案例原因

17

请问有人能解释一下使用响应式风格的优势吗:

Observable<String> greeting = Observable.just("Hello");
Observable<String> yelling = greeting.map(s -> s.toUppercase());

而不是简单的命令式风格:

String greeting = "Hello";
String yelling = greeting.toUppercase();

我将响应式编程理解为一种“API”,可以用于数据库访问、UI、计算、网络访问等。但是为什么我们需要在简单的toUppercase中使用响应式编程呢?

4个回答

20
除了所有的非阻塞特性之外,使用反应式编程的另一个重要功能是重要的背压控制。通常在发布者发出的信息比消费者处理的信息多的情况下使用。
因此,有了这个机制,您可以控制两者之间的流量并避免令人讨厌的内存问题。
您可以在这里看到一些反应式编程的实际示例https://github.com/politrons/reactive
关于背压问题,请参见https://github.com/politrons/Akka/blob/master/src/main/scala/stream/BackPressure.scala
顺便说一句,反应式编程的唯一缺点是学习曲线,因为您正在改变编程范例。但现在所有重要的公司都尊重并遵循反应式宣言http://www.reactivemanifesto.org/
如果您想查看一些实际示例,可以在这里引用https://github.com/politrons/reactive

嗨@Paul,反应式编程在幕后使用NIO吗?谢谢。 - Diego Ramos
它被一些知名公司使用吗?在财富100强企业中呢? - ghostrider
在命令式编程中,过度生产的概念存在于哪里,以使“反压力”变得相关? - so-random-dude
“reactive-manifesto” 是与其他宣言不同的东西,不像其他宣言那样充满废话。 - so-random-dude

6

您是正确的,对于简单的 toUppercase 操作,您不需要使用 RxJava。当您处理异步数据流时,响应式编程具有优势。


6

使用响应式编程所能做的一切,也可以使用简单的函数或简单的事件监听器来完成。

在异步编程中,响应式编程大多数情况下不能使您的代码库更小或更易于阅读。但它会使您的代码更加稳健易于扩展以供以后使用。

当数据作为流发送时,特别是在流上推送了多个元素并且时间不同,并且您需要执行与时间相关的操作时,响应式编程可以使代码更易于维护。


2
在您提供的示例中,响应式编程没有真正的用途。它以一种不同的方式完成了工作。
当您使用数据流并希望以简单有效的方式在所选线程上运行操作时,响应式编程的真正优势就显现出来了。响应式编程具有许多运算符,这可能会吓到初学者,但是一旦您掌握了基础知识,就会更容易理解哪个运算符适合您的需求。
请查看此文章Simple background polling with RxJava,并思考如何使用少量代码在普通Java中获得相同的结果。
我总是喜欢更多的代码行。我的辩护是更多的代码行意味着更容易理解。但是一旦您开始在一个庞大的团队中开展大型项目,理解代码库就变得困难。
以下两者中哪一个更易于理解?
take(10);

或者

int limit = list.size() < 10 ? list.size() : 10;
for (int i = 0 ; i < limit ; i ++) {
    Log.d("Value", list.get(i));
}

两者都会获取列表中的前10个项目。如果列表比10个项目少,则获取总大小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接