摘要:函数式编程这个不温不火的语言由来已久.有人说,这一年它会很火,尽管它很难,这也正是你需要学习的理由.那么,为什么函数式编程在Java中很危险呢?也许这个疑问普遍存在于很多程序员的脑中,作者Elliotte对此发表了一些见解,我们一起来看看他是怎么说的. 在我的日常工作中,我身边的开发者大多是毕业于CS编程顶级院校比如MIT.CMU以及Chicago,他们初次涉及的语言是Haskell.Scheme及Lisp.他们认为函数式编程是一种自然的.直观的.美丽的且高效的编程样式.但奇怪的是,我和我…
二.共享受限资源 有了并发就可以同时做多件事情了.但是,两个或多个线程彼此互相干涉的问题也就出现了.如果不防范这种冲突,就可能发生两个线程同时试图访问同一个银行账户,或向同一个打印机打印,改变同一个值等诸如此类的问题. 1. 不正确地访问资源 考虑下面的例子,其中一个任务产生偶数,而其他任务消费这些数字.这里,消费者任务的唯一工作就是检查偶数的有效性. 首先,我们定义EvenChecker,即消费者任务,因为他将在随后所有的示例中被复用.为了将EvenChecker与我们要试验的各种类型的生成器…
一.程序.进程和线程   程序是一组指令的有序集合,也可以将其通俗地理解为若干行代码.它本身没有任何运行的含义,它只是一个静态的实体,它可能只是一个单纯的文本文件,也有可能是经过编译之后生成的可执行文件.   从狭义来说,进程是正在运行的程序的实例:从广义上来说,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.进程是操作系统进行资源分配的基本单位.   线程是进程中可独立执行的最小单位,它也是处理器进行独立调度和分派的基本单位.一个进程可以包含多个线程,每个线程执行自己的任务,同…
我们编写程序就是为了方便用户使用, 我觉得UI设计的核心就是简洁, 操作过于繁琐的程序让很大一部分用户敬而远之. 即使功能强大, 但是人们更愿意使用易于操作的软件. 近年流行起来的操作手势和逐渐趋于成熟的语言控制以及其他更加易于操作的方式很可能会颠覆鼠标键盘的操作方式, 我相信这一天必将到来. 电影<<普罗米修斯>>中画面 我记得我去年编写了我的第一个用户界面, 现在想起来当时非常令我困惑的有两项: 不知道该如何将自己原来的功能代码与新建的图形界面联系在一起, 对众多的监听器不知从…
在上一篇文章中,我们实现了c语言中的大整数的运算,并且用Miller-Rabin算法实现了对大素数的测试.本来我准备用Java代码实现大整数的运算,查了一下资料发现Java中java.math的BigInteger可以实现大整数的表示和计算.BigInteger 还提供以下运算:模算术.GCD 计算.质数测试.素数生成.位操作以及一些其他操作. 下面通过程序来看看具体用法: import java.math.BigInteger; public class BigInt { public sta…
锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作.Java中的乐观锁基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败. 悲观…
Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出一个对象: InetAddress类可以通过InetAddress类的静态方法获得InetAddress的对象: InetAddress.getLocalHost();//获取本地对象 InetAddress.getByName("");//获取指定名称对象 主要方法使用: //获取本机的…
在Java中,字符串的匹配可以使用下面两种方法:         1.使用正则表达式判断字符串匹配         2.使用Pattern类和Matcher类判断字符串匹配 正则表达式的字符串匹配:         正则表达式:定义一组字符串的一系列字符和符号,它由常量字符和特殊符号构成.         下面是正则表达式的一些预定义字符类,实际上是一些转义字符序列:                 1.\d   代表任何数字                 2.\D  代表任何非数字字符  …
java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >> 1,相当于num除以2 >>>    :     无符号右移,忽略符号位,空位都以0补齐 下面来看看这些移位运算都是怎样使用的…
什么是原子操作 原子操作是指一个或者多个不可再分割的操作.这些操作的执行顺序不能被打乱,这些步骤也不可以被切割而只执行其中的一部分(不可中断性).举个列子: //就是一个原子操作 int i = 1; //非原子操作,i++是一个多步操作,而且是可以被中断的. //i++可以被分割成3步,第一步读取i的值,第二步计算i+1:第三部将最终值赋值给i i++: Java中的原子操作 在Java中,我们可以通过同步锁或者CAS操作来实现原子操作. CAS操作 CAS是Compare and swap的…
一.基本的线程机制 并发编程使我们可以将程序划分为多个分离的.独立运行的任务.通过使用多线程机制,这些独立任务中的每一个都将由执行线程来驱动. 线程模型为编程带来了便利,它简化了在单一程序中同时jiao'zhi'zai'yi'qi交织在一起的多个操作的处理.在使用线程时,CPU将轮流给每个任务分配其占用时间.每个人物都觉得自己在一直占用CPU,但事实上CPU时间是划分成片段分配给所有的任务.线程的一大好处就是可以使你从这个层次抽身出来,即代码不必知道他是运行在具有一个还是多个CPU的机器上.所以…
五. 新类库中的构件 Java SE5的java.util.concurrent引入了大量设计用来解决并发问题的新类.学习使用它们将有助于编写出更加简单而强壮的并发程序. 1. CountDownLatch 他被用来同步一个或多个任务,强制他们等待由其他任务执行的一组操作完成. 你可以向CountDownLatch对象设置一个初始计数值,任何在这个对象上调用wait()方法都将阻塞,直至这个计数值到达0.其他任务在结束其工作时,可以在该对象上盗用countDown()来减小这个计数值.Count…
三.终结任务 1. 在阻塞时终结 线程状态 一个线程可以处于以下四种状态之一: 1)新建(new):当线程被创建时,他只会短暂的处于这种状态.此时,他已经分配了必须的系统资源,并执行了初始化.此刻线程已经有资格获得CPU时间了,之后调度器将把这个线程转变为可运行zhuang't状态或阻塞状态. 2)就绪(Runnable):在这种状态下,只要调度器把时间片分配给线程,线程就可以运行.也就是说,在任意时刻,线程可以运行也可以不运行.只要调度器能分配时间片给线程,他就可以运行,这不同于死亡和阻塞状态…
https://blog.csdn.net/mhmyqn/article/details/47342577 https://www.cnblogs.com/strinkbug/p/5019453.html 在看spring-mvc的源码的时候,看到在解析handler方法时,有关于获取桥接方法代码,不明白什么是桥接方法,经过查找资料,终于理解了什么是桥接方法. 什么是桥接方法 桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自…
类注释 /** * A thread-safe variant of {@link java.util.ArrayList} in which all mutative * operations ({@code add}, {@code set}, and so on) are implemented by * making a fresh copy of the underlying array. * 一个线程安全的ArrayList变量, 其中所有的可变操作(如add, set...) 都会…
0.死锁 两个或者两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,他们都将无法让程序进行下去: 死锁条件: 不可剥夺条件: T1持有的资源无法被T2剥夺 请求与保持条件: T1持有S1的同时,请求S2资源,但是不能立即获得(T表示任务,S表示资源) 互斥条件:  同一时间同一资源只能被一个线程任务使用 循环等待条件:  若干线程之间形成一种头尾相连的循环等待条件(T1拥有S1请求S2,同时T2拥有S2请求S1) 1.共享锁: 也叫s锁/读锁,能查看但无…
1.null是个奇妙的东西,可以理解为对象占位符 User user = null; System.out.println(user.getCredits()); 可以通过编译, User user; System.out.println(user.getCredits());却不行 当类似User user = null;这样的变量去调用只有User user = new User();才能调用的方法时,NullPointerException就触发了. 2.当为null的包装类复值给基本类型…
写在前面 在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢.当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单.恰好我在项目中就遇到了这个问题,需要在Java程序中调用Python程序.关于在Java中调用Python程序的实现,根据不同的用途可以使用多种不同的方法,在这里就将在Java中调用Python程序的方式做一个总结. 直接通过Runtime进行调用 我们知道,在Java中如果需要调用第三方程序,可以直接通过Runtime实现,这…
函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网 函数式编程很难,这正是你要学习它的原因 156 次分享 新浪微博 腾讯微博 Tweet 人人网 QQ空间 很奇怪不是,很少有人每天都使用函数式编程语言.如果你用Scala,Haskell,Erlang,F#或某个Lisp方言来编程,很可能没有公司会花钱聘你.这个行业里的绝大部分人都是使用像Python,Ruby,Java或C#等面向对象的编程语言——它们用起来很顺手.不错,你也许会偶然用到一两个“函数式语言特征”,例如“block”,但…
原文地址:An easier path to functional programming in Java 原文作者:Venkat Subramaniam 译文出自:掘金翻译计划 以声明式的思想在你的 Java 程序中使用函数式编程技术 Java™ 开发人员习惯于面向命令式和面向对象的编程,因为这些特性自 Java 语言首次发布以来一直受到支持.在 Java 8 中,我们获得了一组新的强大的函数式特性和语法.函数式编程已经存在了数十年,与面向对象编程相比,函数式编程通常更加简洁和达意,不易出错,…
paip. java的 函数式编程 大法 Java 语言中常被忽视的一个方面是它被归类为一种命令式(imperative)编程语言.命令式编程虽然由于与 Java 语言的关联而相当普及,但是并不是惟一可用的编程风格,也不总是最有效的.在本文中,我将探讨在 Java 开发实践中加入不同的编程方法 ── 即函数编程(FP 如何使用像闭包(closure)和 高阶函数(higher order function)这样的函数编程结构,在 Java 语言中编写良构的.模块化的代码. 作者Attilax 艾…
一.引言 javascript函数式编程在最近两年来频繁的出现在大众的视野,越来越多的框架(react,angular,vue等)标榜自己使用了函数式编程的特性,好像一旦跟函数式编程沾边,就很高大上一样,而且还有一些专门针对函数式编程的框架和库,比如:RxJS.cycleJS.ramdaJS.lodashJS.underscoreJS等.近年来随着技术的发展,函数式编程已经在实际生产中发挥巨大的作用了,越来越多的语言开始加入闭包,匿名函数等非常典型的函数式编程的特性,从某种程度上来讲,函数式编程…
前提 回想一下,JDK8是2014年发布正式版的,到现在为(2020-02-08)止已经过去了5年多.JDK8引入的两个比较强大的新特性是Lambda表达式(下文的Lambda特指JDK提供的Lambda)和Stream,这两个强大的特性让函数式编程在Java开发中发扬光大.这篇文章会从基本概念.使用方式.实现原理和实战场景等角度介绍Lambda的全貌,其中还会涉及一些函数式编程概念.JVM一些知识等等. 基本概念 下面介绍一些基本概念,一步一步引出Lambda的概念. 函数式接口 函数式接口和…
前言 最近真的是太忙忙忙忙忙了,很久没有更新文章了.最近工作中看到了几段关于函数式编程的代码,但是有点费解,于是就准备总结一下函数式编程.很多东西很简单,但是如果不总结,可能会被它的各种变体所困扰.接触Lambda表达式已经很久了,但是也一直是处于照葫芦画瓢的阶段,所以想自己去编写相关代码,也有些捉襟见肘. 1. Lambda表达式的不同形式 // 基本形式 参数 -> 主体 1.1 形式一 Runnable noArguments = () -> System.out.println(&qu…
最近在读Thinking In Java,秉着有些地方还能知道自己不会的精神,都去好好查阅了一些资料,在内存分配这一章,看到finalize()这个方法,刚开始很不理解,查阅了一些资料,顺带看了一下final.finally,现在分享一下. 一.final的介绍 final可用在4个地方,分别是变量(static 或者 !static),形式参数,方法和类,每种情况都有不同的含义,下面分别介绍之: final修饰变量: 对基本类型表示变量被赋值后是一个常量,即不可改变的:对引用类型,表示引用指向…
自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接. 如果你在Java1.5下进行过编程的话,你一定不会陌生这一点,你不能直接地向集合(Collections)中放入原始类型值,因为集合只接收对象.通常这种情况下你的做法是,将这些原始类型的值转换成对象,然后将这些转换的对象放入集合中.使用Integer,Double,Boolean等这些类我们可以将原始…
转:JavaScript函数式编程(一) 一.引言 说到函数式编程,大家可能第一印象都是学院派的那些晦涩难懂的代码,充满了一大堆抽象的不知所云的符号,似乎只有大学里的计算机教授才会使用这些东西.在曾经的某个时代可能确实如此,但是近年来随着技术的发展,函数式编程已经在实际生产中发挥巨大的作用了,越来越多的语言开始加入闭包,匿名函数等非常典型的函数式编程的特性,从某种程度上来讲,函数式编程正在逐步"同化"命令式编程. JavaScript 作为一种典型的多范式编程语言,这两年随着React…
简介 网络无处不在,移动互联时代也早已到来,单机版程序慢慢的已没有生命力,所有的程序都要能够访问网络,比如 QQ 网络聊天程序.迅雷下载程序等,这些程序都要同网络打交道,本次将与各位小伙伴们分享的就是 Java 中的网络编程—— Socket 通信. 网络基础知识 两台计算机要通过网络进行通信,必须具备如图所示的条件: a.唯一的标识(IP地址): b.需要共同的语言(协议): c.辨别不同应用程序(端口号). 其中的重要概念如下: 1.IP地址 每台计算机的唯一标识,用来区分网络中的不同主机,…
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 译者团队(排名不分先后):阿希.blueken.brucecham.cfanlife.dail.kyoko-df.l3ve.lilins.LittlePineapple.MatildaJin.冬青.pobusama.Cherry.萝卜.vavd317.vivaxy.萌萌.zhouyao 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实的梁柱:分享…
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实的梁柱:分享,是 CSS 里最闪耀的一瞥:总结,是 JavaScript 中最严谨的逻辑.经过捶打磨练,成就了本书的中文版.本书包含了函数式编程之精髓,希望可以帮助大家在学习函数式编程的道路上走的更顺畅.比心. 译者团队(排名不分先后):阿希.blueken.brucecham.cfanlife.d…