在简单情况下使用响应式编程的原因

问题描述 投票:0回答:5

请有人向我解释一下使用响应式风格的优点是什么:

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

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

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

我理解反应式编程就像用于数据库访问、UI、计算、网络访问等的相同“API”。但是为什么我们需要使用反应式编程来实现简单的

toUppercase

rx-java reactive-programming rx-java2 imperative-programming
5个回答
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


6
投票

你是对的,你不需要使用RxJava“简单的toUppercase”。 当您使用异步数据流时,反应式编程具有优势。


6
投票

您可以使用响应式编程做的所有事情,您也可以使用简单的函数或简单的事件侦听器来完成。

在异步编程中:大多数情况下,反应式编程无法甚至使您的代码库更小更易于阅读。但它将使您的代码更健壮易于扩展以供以后使用。

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


2
投票

在您给出的上面的示例中没有真正使用反应式编程。它以不同的方式完成工作。

当您处理数据流并且希望以简单有效的方式对它们进行操作并可以在您喜欢的线程上运行时,反应式编程的真正优势就会显现出来。响应式编程有很多运算符,这会让新手程序员感到害怕,但是一旦您学习了基础知识,就会更容易理解哪个运算符适合您的需求。

看看这篇文章 Simple back 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 项。如果列表较小,则获得总大小。


0
投票

无论如何,我只想说Reactive用起来并不方便。在很多情况下,它破坏了程序的线性依赖关系,使代码过于复杂、难以理解,样板代码过多。这就是为什么 Reactive 已经出现了这么多年却从未被广泛推广和流行的原因。

总结:复杂

© www.soinside.com 2019 - 2024. All rights reserved.