多线程闲聊(三)


作为一名Android开发工程师,我对于RxJava还是比较熟悉的。或者说,如果让我凭空开发出类似RxJava的效果,说真的,我感觉我真的可以!在这里我推荐一本相关介绍函数式编程的相关书籍,当你读完可这本书,我感觉你能够对函数式编程有相对深入并且清晰的理解。《Java函数式编程》- 高清华

RxJava就是函数式编程的集大成者,他不仅仅达到了函数式编程的懒加载等效果,而且将链式编程方式做到了近乎完美的效果。如果你对于函数式编程没有任何的了解,那么,RxJava就仅仅是一个可能不太称手的工具而已。我看了一眼公司里某些同时写的类似多层if嵌套的RxJava应用代码,也就是在一个Flowable的subscribe里嵌套了另外一个Flowable,然后默默地叹了一口气。法拉利能让你用成洒水车,这其实在某种意义上也是一种天赋吧。

如果你通过阅读,知道了一个知识,那么你仅仅是处于知道的状态,而且,随时都有可能被遗忘。但是当你将其应用,那么,知识本身就能成为你的血肉,因为知识不再是别人给你的食物,而是被你分解再重构成为你的一部分。

函数式编程的一个简单应用就是函数的复合,其实在RxJava里面也有着广泛的应用。还记得RxJava对于方法在线程之间的简单切换吗?两个不同线程间的方法其实就是被复合成了一个函数,从而让调用可以在目标线程之间能够更加简单地进行调用。我们都知道,在Rxjava里进行线程切换只有两个方式,subscribeOn和observeOn,以及有可能对其整合的compose方法。网上有很多对这两个方法的描述的方法的博客,不过说真的,很多都是连文档都没有看过的瞎写。他们得出结论的方式往往是多次调用subscribeOn然后得出哪次有效的结论,这样得出的结论竟然还能堂而皇之地写在博客上发送到网络上,不免太过于可笑。

那么就来说说,为什么会有这两个方法吧。为了链式地进行函数式调用,真正严谨地函数式编程是没有任何副作用的,并且仅仅有一个参数,这个参数仅仅充当着提供信息副本的作用,注意,这个参数不能被改变。因此,在调用RxJava的时候,虽然不用很严谨地完全符合函数式编程的要求,但是尽可能还是不要在链式调用里再去引用外部数据,更不要去修改外部的数据。既然说RxJava的目的之一就是让线程切换本身都能用链式调用的方式进行,那么我就肯定需要指定RxJava.just(obj)操作所在的线程,因为往往这第一步操作并不是单纯地发送一个实例地引用,常常会提供一个生成这个实例的方法,既然是方法,就需要指定执行的线程,默认肯定是在调用的线程。但是android很多时候,调用方法的都是UI线程,因此对于比较耗时的操作,就需要通过subscribeOn方法来指定最初的线程到底是哪个。这也就有了很多博客所谓的subscribeOn作用的是调用其之前的方法,observeOn则是调用其之后的方法,然后observeOn指定的结果subscribeOn能对其进行覆盖,这样可笑的结论。为什么我断定他们这样的说法肯定是错误的呢?因为只有傻子才会让自己所开发的东西这么难用!规则简单,而实现规则的方式常人难以做到,这才是高手所为。subscribeOn的作用就像我之前所说,仅仅是指定最初的实体在哪里生成,以及默认的线程是哪个,仅此而已。RxJava是基于懒加载的思路来实现的,也就是说,直到你调用了subscribe()方法之前,你的所有方法,仅仅是对于任务的规划而已,比如说,这些方法是在这个线程里执行,那些方法是在那个线程里执行,这个线程执行的结果作为那个线程函数的参数等等。至于subscribeOn如果重复调用到底哪个有效,这个肯定是第一个有效,我可不认为在长长的链式调用里,去找最后一个subscribeOn方法有什么特别的意义,只会让人感到厌烦而已。简单来说,subscribeOn方法的作用是承上,那么observeOn方法的作用就是启下,他规划了从调用一个observeOn方法到调用下一个observeOn方法之间的函数在哪个线程里执行,就是这么简单。

所以你懂了吧,当你获取到一个Flowable或者RxJava对象,你实际上获取到的是一串函数所组成的任务。所以当你在调用了flatMap方法时其实传入的参数,就是flatMap调用之前的所有方法所组成的任务而已。因此,我们完全可以使用它来达成自己的各种复用的目的。

Java多线程闲聊(三):RxJava相关推荐

  1. Java多线程闲聊(五):AQS

    Java多线程闲聊(五):AQS 前言 今天的第二篇了,我肚子里也没有那么多的墨水,所以这第二篇的前言,就免了吧. 正文 AQS,AbstractQueueSynchronizer,是Java官方所提 ...

  2. Java多线程闲聊(六):synchronized关键字

    Java多线程闲聊(六):synchronized关键字 前言 这篇文章我会在博客置顶,为什么呢?因为,三篇引用的文章写得太好了,我害怕后面找不到,看不到,然后忘了! 让我想想,感觉昨天的前言把最近肚 ...

  3. Java多线程闲聊(四):阻塞队列与线程池原理

    Java多线程闲聊(四)-阻塞队列与线程池原理 前言 复用永远是人们永恒的主题,这能让我们更好地避免重复制造轮子. 说到多线程,果然还是绕不开线程池,那就来聊聊吧. 人们往往相信,世界是存在一些规律的 ...

  4. Java多线程闲聊(二):活锁和死锁

    Java多线程闲聊(二):活锁和死锁 这两个情况其实都是应该需要避免的情况,为了便于自己的回顾,我还是希望通过尽可能简单的表达来进行简要的归纳. 何谓死锁,就是正正紧紧按照Java的规范进行编程依然会 ...

  5. Java 多线程(三) 线程的生命周期及优先级

    Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: ...

  6. Java 多线程(三):锁(一)

    Java 多线程(三):锁(一) 作者:Grey 原文地址: 博客园:Java 多线程(三):锁(一) CSDN:Java 多线程(三):锁(一) CAS 比较与交换的意思 举个例子,内存有个值是 3 ...

  7. Java总结篇系列:Java多线程(三)

    2019独角兽企业重金招聘Python工程师标准>>> 本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 public cla ...

  8. Java多线程系列(三):Java线程池的使用方式,及核心运行原理

    之前谈过多线程相关的4种常用Java线程锁的特点,性能比较.使用场景,今天主要分享线程池相关的内容,这些都是属于Java面试的必考点. 为什么需要线程池 java中为了提高并发度,可以使用多线程共同执 ...

  9. java线程安全例子_Java总结篇系列:Java多线程(三)

    本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 1 public classThreadTest {2 3 public static voi ...

最新文章

  1. 封装CoreGraphics的API简化绘图操作
  2. Shell脚本基本命令4
  3. 隐马尔科夫模型——简介
  4. 外链式样式表_引入CSS样式表(书写位置)
  5. 我觉得这个世界不是特别的好,你说呢
  6. win10下用VM 14安装OS X 10.11
  7. php中smarty模板下载,Smarty模板下载|
  8. haar特征简单分析
  9. HighCharts图标中隐藏x/y轴坐标
  10. 使用OpenResty达到十万级并发超高性能Web应用(一):HelloWorld
  11. SharePoint 2013 文档库“样式”变了
  12. 怎么把旧iPhone上的备份迁移到新iPhone上?
  13. 系统分析师上午题-第 8 章 企业信息化战略与实施
  14. thinkphp6下载汉字转拼音包以及其使用方法
  15. 非机动车检测,电动车自行车检测
  16. C语言实现—学生成绩管理系统
  17. 基于python的2048游戏设计_Python经典练习,游戏2048实现思路
  18. 【Rust】cargo update或者cargo build国内被墙失败解决办法
  19. 【计算机系统结构】第2章 计算机指令集结构设计问答题
  20. 【P25】国货精品,直流单电源转双电源方案

热门文章

  1. libevent+多线程的服务器模型
  2. Linux驱动程序中的file,inode,file_operations三大结构体
  3. linux安装软件不同用户名密码,Linux的安装和基本命令
  4. java f反射_java反射机制[基础学习]
  5. python os.environ gpu_Tensorflow下如何实现多GPU数据并行训练?
  6. python阶乘匿名函数_python的高阶函数与匿名函数
  7. oracle正则表达式截断,在oracle中使用正则表达式截取字符串
  8. adding oracle jvm 慢,java – 什么JVM优化导致这些性能结果?
  9. 华为stfal00是什么手机_opporeno5pro和华为p40pro有什么区别 哪款手机更好
  10. php通过浏览器下载json文件遇到的问题