在Java 7之前,并行处理数据集合非常麻烦.第一,你得明确地把包含数据的数据结构分成若干子部分.第二,你要给每个子部分分配一个独立的线程.第三,你需要在恰当的时候对它们进行同步来避免不希望出现的竞争条件,等待所有线程完成,最后把这些部分结果合并起来.Java 7引入了一个叫作分支/合并的框架,让这些操作更稳定.更不易出错. Stream接口让你不用太费力气就能对数据集执行并行操作.它允许你声明性地将顺序流变为并行流.此外,你将看到Java是如何变戏法的,或者更实际地来说, 流是如何在幕后应用J…
在Java 7之前,并行处理集合非常麻烦.首先你要明确的把包含数据的数据结构分成若干子部分,然后你要把每个子部分分配一个独立的线程.然后,你需要在恰当的时候对他们进行同步来避免竞争,等待所有线程完成.最后,把这些部分结果合并起来.Java 7中引入了一个叫做 分支/合并的框架,让这些操作更稳定,更不容易出错. 并行流 使用Stream接口可以方便的处理它的元素,可以通过对收集源调用parallelStream方法来把集合转换为并行流.并行流就是一个把内容分成多个数据块,并用不同的线程分别处理每个…
1. 流简介 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).就现在来说,你可以把它们看成遍历数据集的高级迭代器.此外,流还可以透明地并行处理.让我们来看一个实例返回低热量(<400)的菜肴名称: Java7版本: List<Dish> lowCaloricDishes = new ArrayList<>(); // 用累加器筛选元素 for(Dish d: menu){ if(d.getCalories() &l…
流让你从外部迭代转向内部迭代,for循环显示迭代不用再写了,流内部管理对集合数据的迭代.这种处理数据的方式很有用,因为你让Stream API管理如何处理数据.这样Stream API就可以在背后进行多种优化.此外,使用内部迭代的话,Stream API可以决定并行运行你的代码.这要是用外部迭代的话就办不到了,因为你只能用单一线程挨个迭代. 1. 筛选和切片 1.1 用谓词筛选 该操作会接受一个谓词(一个返回 boolean的函数)作为参数,并返回一个包括所有符合谓词的元素的流.筛选出所有素菜…
某个网站的数据来自Facebook.Twitter和Google,这就需要网站与互联网上的多个Web服务通信.可是,你并不希望因为等待某些服务的响应,阻塞应用程序的运行,浪费数十亿宝贵的CPU时钟周期.比如,不要因为等待Facebook的数据,暂停对来自Twitter的数据处理. 第7章中介绍的分支/合并框架以及并行流是实现并行处理的宝贵工具;它们将一个操作切分为多个子操作,在多个不同的核.CPU甚至是机器上并行地执行这些子操作.与此相反,如果你的意图是实现并发,而非并行,或者你的主要目标是在同…
自1998年 JDK 1.0(Java 1.0) 发布以来,Java 已经受到了学生.项目经理和程序员等一大批活跃用户的欢迎.这一语言极富活力,不断被用在大大小小的项目里.从 Java 1.1(1997年) 一直到 Java 7(2011年),Java 通过增加新功能,不断得到良好的升级.Java 8 则是在2014年3月发布的.Java 8 所做的改变,在许多方面比 Java 历史上任何一次改变都深远,而且极大的提高了 Java 代码的简洁性. 1. lambda 表达式 本文通过筛选苹果的需…
你将了解行为参数化,这是Java 8非常依赖的一种软件开发模式,也是引入 Lambda表达式的主要原因.行为参数化就是可以帮助你处理频繁变更的需求的一种软件开发模式.一言以蔽之,它意味 着拿出一个代码块,把它准备好却不去执行它.这个代码块以后可以被你程序的其他部分调用.本章通过筛选苹果这个实际需求来一步步引出Lambda表达式,同时我也会把代码贴出来,读完你会看到代码是如何一步一步的向Lambda转化.多代码来袭,保护我方ADC!! 代码演化 1.实习生版本 package com.lujiah…
1. Lambda简介 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 匿名--我们说匿名,是因为它不像普通的方法那样有一个明确的名称:写得少而想得多! 函数--我们说它是函数,是因为Lambda函数不像方法那样属于某个特定的类.但和方法一样,Lambda有参数列表.函数主体.返回类型,还可能有可以抛出的异常列表. 传递--Lambda表达式可以作为参数传递给方法或存储在变量中. 简洁--无需像…
传统上,Java程序的接口是将相关方法按照约定组合到一起的方式.实现接口的类必须为接口中定义的每个方法提供一个实现,或者从父类中继承它的实现. 但是,一旦类库的设计者需要更新接口,向其中加入新的方法,这种方式就会出现问题.现实情况是,现存的实体类往往不在接口设计者的控制范围之内,这些实体类为了适配新的接口约定也需要进行修改. 由于Java 8的API在现存的接口上引入了非常多的新方法,这种变化带来的问题也愈加严重,一个例子就是前几章中使用过的 List 接口上的 sort 方法. 想象一下其他备…
1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法.ALGOL W是第一批在堆上分配记录的类型语言之一.Hoare选择null引用这种方式,"只是因为这种方法实现起来非常容易".虽然他的设计初衷就是要"通过编译器的自动检测机制,确保所有使用引用的地方都是绝对安全的",他还是决定为null引用开个绿灯,因为他认为这是为"不存在的值"建模最容易的方式.很多年后,他开始为自己曾经做过这样的决定而…