immutable

Spliterator<T> 接口

丶灬走出姿态 提交于 2019-11-29 16:03:10
文档说明 一个用于对一个源当中的元素进行遍历和分区的对象 一个 Spliterator 涵盖的源中的元素可以是数组、Collection、IO通道、生成器函数 一个 Spliterator 可以一个一个地遍历元素(tryAdvance()),也可以顺序地分块遍历(forEachRemaining()) 一个 Spliterator 可以对其元素使用 trySplit 进行分区形成另外的 Spliterator,使用在并行操作中 操作中使用的 Spliterator 但无法进行分割,或者分割结果高度不平衡或低效,则操作不能从并行当中获益 遍历以及分割都会消耗掉元素,每一个 Spliterator 只对其对应的单个块进行运算 一个 Spliterator 还会去报告一个装有其构造、源以及其元素的特性值的集合,特性值有:ORDERED、DISTINCT、SORTED、SIZED、NONNULL、IMMUTABLE、CONCURRENT、SUBSIZED 这些特性可被 Spliterator 的使用者调用,以特化或简化计算 特性值都是通过位操作进行标识的 部分特性值会额外地限定方法的行为 如:ORDER,遍历方法必须遵循它们在文档中定义好的顺序 未来可能还会定义新的特性值,因此实现者不应该给8个特性值以外的词赋予新的含义 当一个 Spliterator 不包含 `IMMUTABLE` 或

多线程设计模式

别等时光非礼了梦想. 提交于 2019-11-29 08:33:32
原创转载请注明出处: https://www.cnblogs.com/agilestyle/p/11494963.html Single Threaded Execution —— 能通过这座桥的只有一个人 所谓“Single Threaded Execution”,即“以一个线程执行”,该模式用于设置限制,以确保同一时间内只让一个线程执行处理。 Immutable —— 想破坏也破坏不了 Immutable模式中存在着确保实例状态不发生改变的类(immutable类)。在访问这些实例时并不需要执行耗时的互斥处理,因此若能巧妙利用该模式,定能提高程序性能。 Guarded Suspension —— 等我准备好 如果执行现在的处理会造成问题,就让执行处理的线程等待,通过让线程等待来保证实例的安全性。 Balking —— 不需要就算了 如果现在不合适执行这个操作,或者没必要执行这个操作,就停止处理,直接返回。 Producer-Consumer —— 我来做,你来用 Producer:生成数据的线程 Consumer:使用数据的线程 Producer-Consumer模式在生产者和消费者之间加入了一个“桥梁角色”,该桥梁用于消除线程间处理速度的差异。 Read-Write Lock —— 大家一起读没问题,但读的时候不要写 当线程读取实例的状态时,实例的状态不会变化

Immutable Object模式 - 多线程

≡放荡痞女 提交于 2019-11-29 04:10:28
Immutable Object模式 - 多线程 前言 在多线程编程中,我们常会碰到修改一个对象的值,如果在不加锁的情况下 ,就会出现值不一致的问题,那么有没有一种方式可以不通过加锁的方式也可以保证数据的一致性呢,当然有,今天介绍的不可变对象模式就可以达到这样的效果 问题 如何在多线程情况下,不重复打印出0-99的数值 可变对象模式下 首先新建一个Count对象,代码如下: /** * @Author: Wang Chong * @Date: 2019/9/2 22:02 * @Version: V1.0 */ public class Count { private int i; public int getI() { return i; } public void setI(int i) { this.i = i; } } 新建一个CountThread线程 /** * @Author: Wang Chong * @Date: 2019/9/2 22:14 * @Version: V1.0 */ public class CountThread implements Runnable { private Count count; public CountThread(Count count) { this.count = count; } @Override public

React 不可变数据Immutable

假装没事ソ 提交于 2019-11-29 02:42:19
1, 为什么要用到不可变数据 ? 因为,从React渲染组件性能考虑,使用旧数据创建新数据时,要保证旧数据同时可用且不变。 如果是简单的赋值给一个新的变量,新的对象和旧的对象只是名称不同,实际上占用了同样的内存地址仅仅名称不同 这对react响应重新渲染造成了性能影响,或不能及时更新dom。 2, 但是深拷贝,会占用大量的内存和cpu特别是在复杂结构中,如何处理 ? 引入 Immutable.js 不可变数据插件,使用了结构共享,如果对象中只有一个节点发生变化,只修改这一个节点和受它影响的节点, 其他节点共享。 是Facebook工程师 Lee Byron3年时间打造,实现来一套持久化数据结构, 如:Collection List Map Set Record等,获取数据和普通对象不同 如:map.get('key') 获取对象值 如:array.get(0) 相当于 array[0] 3, 示例 import { Map } from 'immutable'; let a = Map({ select: 'users', filter: Map({ name: 'Kim' }) }) let b = a.set('select', 'people'); a === b // false a.get('filter') === b.get('filter'); // true .

SCALA基础

一个人想着一个人 提交于 2019-11-28 19:48:41
SCALA基础 面向对象和面向函数的集成 !!!! 一切值都是对象,一切函数都是值 !!!! 函数时编程,一切都是函数 数学式的语法思维 —————————————————————— IDEA开发环境准备: 1、安装JDK、SCALA环境 2、IDEA安装scala插件 3、创建maven工程,创建目录,设置为root source目录 4、创建文件,后缀为scala 5、scala可以直接与java交互 —————————————————————— [TOC] —————————————————————— 1、标识符 字母数字标识符:使用字母或者下划线开头,$符号在SCALA中也被看做是字母,但应该尽量避免定义$开头的变量,因为SCALA存在保留变量以$开头 符号:符号标识符包含一个或多个表示符, SCALA编译时会将符号转换为$开头的变量名 ,如 : - > 会被转义为$column$minus$greater,可以看出会转义为$英文单词,因此在java中调用scala程序时要使用转义后的符号 2、import导包 SCALA的import可以出现在任何地方,有效范围:从声明处开始到程序最后结束。 SCALA会默认导入java.lang._ ,scala._包,因此以scala开头的包使用时会省略包名的引用。 3、变量与常量 vaR定义变量 变量定义时必须 赋值 : var A

纯函数

冷暖自知 提交于 2019-11-27 20:42:51
和纯函数相反的就是“不纯函数”(Impure Function),一个函数之所以不纯,可能做了下面这些事情: ·改变全局变量的值。 ·改变输入参数引用的对象,就像上面不是纯函数的arrayPush实现。 ·读取用户输入,比如调用了alert或者confirm函数。 ·抛出一个异常。 ·网络输入/输出操作,比如通过AJAX调用一个服务器的API。 ·操作浏览器的DOM。 上面还只是不纯函数的一部分表现,其实,有一个很简单的判断函数纯不纯的方法,就是假设将一个函数调用替换为一个预期返回的常数,程序运行结果是否一样。 数据不可变(Immutable)是函数式编程非常重要的一个概念,对于刚刚接触这个概念的朋友,可能会觉得莫名其妙,因为众所周知程序就是用代码指令在操作数据,如果数据不能变化,那一个程序又能够干什么有用的事情? 程序要好发挥作用当然是要产生变化的数据,但是并不意味着必须要去修改现有数据,替换方法是通过产生新的数据,来实现这种“变化”,也就是说,当我们需要数据状态发生改变时,保持原有数据不变,产生一个新的数据来体现这种变化。 不可改变的数据就是Immutable数据,它一旦产生,我们就可以肯定它的值永远不会变,这非常有利于代码的理解。 其实,你可能已经体会到了Immutable数据类型的好处,在JavaScript中,字符串类型、数字类型就是不可改变的数据