《Java8实战》第1章 Java 8、9、10 以及 11 的变化

如想了解 Oracle 公司对 JDK 的最新支持情况,请访问https://www.oracle.com/technetwork/java/java-se-supportroadmap.html。
所有的示例代码均可见于图灵社区本书主页 http://ituring.com.cn/book/2659“随书下载”处。

1.1 为什么要关心 Java 的变化

Java8做的改变很大,并且编程更更容易了,不需要写啰嗦的代码
比如:按照重量给 inventory 中的苹果排序

Collections.sort(inventory, new Comparator<Apple>() { 
 public int compare(Apple a1, Apple a2){ 
   return a1.getWeight().compareTo(a2.getWeight()); 
 } 
});

使用Java8后,让代码读起来更接近问题描述本身:
inventory.sort(comparing(Apple::getWeight));

从 Java 的演进路径来看,它一直致力于让并发编程更容易、出错更少。Java8会更好的利用cpu核
特性

  • Stream API;
  • 向方法传递代码的技巧;
  • 接口的默认方法。

Java 8 提供了一个新的 API(称为“流”,Stream),它支持多个数据处理的并行操作,其思路和数据库查询语言类似。 Java 8 中加入 Stream 可以视为添加另外两项的直接原因:向方法传递代码的简洁技巧(方法引用、Lambda)和接口中的默认方法。它提供了一种新的方式,能够简洁地表达行为参数化

1.2 Java 怎么还在变

编程语言就像生态系统一样,新的语言会出现,旧语言则被取代,除非它们不断演变。

1.2.1 Java 在编程语言生态系统中的位置

Java它就是一门精心设计的面向对象的语言。提供了大量有用的库。集成的线程和锁的支持,还有jvm虚拟机的平台。
image.png

1.2.2 流处理

第一个编程概念是流处理。流是一系列数据项,一次只生成一项。程序可以从输入流中一个一个读取数据项,然后以同样的方式将数据项写入输出流。一个程序的输出流很可能是另一个程序的输入流。
Java 8 可以透明地把输入的不相关部分拿到几个 CPU 核上去分别执行你的Stream 操作流水线——这是几乎免费的并行,用不着去费劲搞 Thread 了

1.2.3 用行为参数化把代码传递给方法

1.2.4 并行与共享的可变数据

Java 8 的流实现并行比 Java 现有的 Thread API 更容易,因此,尽管可以使用 synchronized来打破“不能有共享的可变数据”这一规则,但这相当于是在和整个体系作对,因为它使所有围绕这一规则做出的优化都失去意义了。在多个处理器核之间使用 synchronized,其代价往往比你预期的要大得多,因为同步迫使代码按照顺序执行,而这与并行处理的宗旨相悖。
没有共享的可变数据,以及将方法和函数(即代码)传递给其他方法的能力,这两个要点是函数式编程范式的基石

1.2.5 Java 需要演变

从泛型到for-each,以及各种锁,Java一直在进化。

1.3 Java 中的函数

编程语言中的函数一词通常是指方法,尤其是静态方法,这是在数学函数,也就是没有副作用的函数之外的一个新含义
编程语言的整个目的就在于操作值,按照历史上编程语言的传统,这些值应被称为一等值(或一等公民)。编程语言中的其他结构也许有助于表示值的结构,但在程序执行期间不能传递,因而是二等值。比如方法和类等则是二等值。
用方法来定义类很不错,类还可以实例化来产生值,但方法和类本身都不是值。人们发现,在运行时传递方法能将方法变成一等值,因此 Java 8 的设计者把这个功能加入到了 Java中。

1.3.1 方法和 Lambda 作为一等值

Scala和 Groovy等语言的实践已经证明,让方法等概念作为一等值可以扩充程序员的工具库,从而让编程变得更容易。
我们介绍的 Java 8 的第一个新功能是方法引用。比方说,你想要筛选一个目录中的所有隐藏文件。你需要编写一个方法,然后给它一个 File,判断文件是不是隐藏的。
File类里面有一个叫作 isHidden 的方法。可以把它看作一个函数,接受一个 File,返回一个布尔值。但要用它做筛选,需要把它包在一个 FileFilter 对象里,然后传递给 File.listFiles方法,如下所示:
image.png

1.3.2 传递代码:一个例子

一个 Apple 类,它有一个 getColor 方法,还有一个变量 inventory 保存着一个 Apples 列表。你可能想要选出所有的绿苹果(此处使用包含值 GREEN 和 RED 的 Color 枚举类型 ),并返回一个列表。在 Java 8 之前,你可能会写这样一个方法filterGreenApples:
image.png

public static List<Apple> filterHeavyApples(List<Apple> inventory){ 
 List<Apple> result = new ArrayList<>(); 
 for (Apple apple: inventory){ 
   if (apple.getWeight() > 150) { 
     result.add(apple); 
   } 
 } 
 return result; 
}

与上面的代码的区别在于if条件的不同,基本是复制粘贴。
如果Java 8 会把条件代码作为参数传递进去

public static boolean isGreenApple(Apple apple) {
    return GREEN.equals(apple.getColor());
}
public static boolean isHeavyApple(Apple apple) {
    return apple.getWeight() > 150;
}
// 写出来是为了清晰(平常只要从java.util.function导入就可以了)
public interface Predicate<T>{
    boolean test(T t);
}
static List<Apple> filterApples(List<Apple> inventory,
                                Predicate<Apple> p) {// 方法作为 Predicate参数 p 传递进去
    List<Apple> result = new ArrayList<>();
    for (Apple apple: inventory){
        if (p.test(apple)) {// 苹果符合 p所代表的条件吗
            result.add(apple);
        }
    	return result;
	}
}

要用它的话,你可以写:
filterApples(inventory, Apple::isGreenApple);
或者
filterApples(inventory, Apple::isHeavyApple);

什么是谓词?
前面的代码传递了方法 Apple::isGreenApple(它接受参数 Apple 并返回一个boolean)给 filterApples,后者则希望接受一个 Predicate参数。谓词(predicate)在数学上常常用来代表类似于函数的东西,它接受一个参数值,并返回 true 或 false。后面你会看到,Java 8 也允许你写 Function<Apple,Boolean>——在学校学过函数却没学过谓词的读者对此可能更熟悉,但用 Predicate是更标准的方式,效率也会更高一点儿,这避免了把 boolean 封装在 Boolean 里面。

1.3.3 从传递方法到 Lambda

如果需要单独写一些isHeavyApple 和 isGreenApple这种就用一两次的方法可能感觉也没那么好,所以就它引入了一套新记法(匿名函数或 Lambda),让你可以写

filterApples(inventory, (Apple a) -> GREEN.equals(a.getColor()) ); 
或者
filterApples(inventory, (Apple a) -> a.getWeight() > 150 );
甚至
filterApples(inventory, (Apple a) -> a.getWeight() < 80 || RED.equals(a.getColor()) ); 

这样就不需要定义了。
Java还加了filter和几个相关的东西作为通用库,比如
static <T> Collection<T> filter(Collection<T> c, Predicate<T> p);
所以,这样子写就可以了
filter(inventory, (Apple a) -> a.getWeight() > 150 );
但是,为了更好地利用并行,Java 的设计师没有这么做。Java 8 中有一整套新的类 Collection API——Stream,它有一套类似于函数式程序员熟悉的 filter 的操作,比如 map、reduce,还有接下来要讨论的在 Collection 和 Stream 之间做转换的方法。

1.4 流

如果你想从从一个列表中筛选金额较高的交易,然后按货币分组。你大概的写一大堆的代码
image.png

上面的代码复杂并且几个嵌套的控制流指令
有了Java8,可以这样写
image.png

并行处理:
List<Apple> heavyApples =inventory.parallelStream().filter((Apple a) -> a.getWeight() > 150).collect(toList());

几乎是“免费”的并行处理。

1.5 默认方法及 Java 模块

一个接口如果想增加一个方法,那么所有实现这个接口的类都要去实现这个方法。工作量太大了。
Java8接口如今可以包含实现类没有提供实现的方法签名了.这就给接口设计者提供了一种扩充接口的方式,而不会破坏现有的代码。Java 8 在接口声明中使用新的 default 关键字来表示这一点。

default void sort(Comparator<? super E> c) { 
 Collections.sort(this, c); 
} 

1.6 来自函数式编程的其他好思想

Java 从函数式编程引入的两个核心思想:将方法和 Lambda 作为一等值,以及在没有可变共享状态时,函数或方法可以有效、安全地并行执行
Java 8 提供了一个 Optional类,如果你能一致地使用它,就能帮助你避免出现 NullPointerException。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/10082.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[MAUI 项目实战] 手势控制音乐播放器(三): 动画

文章目录吸附动画确定位置平移动画回弹动画使用自定义缓动函数多重动画点击动画项目地址上一章节我们创建了手势容器控件PanContainer&#xff0c;它对拖拽物进行包装并响应了平移手势和点击手势。拖拽物现在虽然可以响应手势操作&#xff0c;但视觉效果较生硬&#xff0c;一个…

总结一下Redis的缓存雪崩、缓存击穿、缓存穿透

缓存是提高系统性能的一种常见手段&#xff0c;其中Redis是一种常用的高性能缓存数据库。但是在使用缓存时&#xff0c;可能会遇到一些问题&#xff0c;比如缓存击穿、缓存穿透、缓存雪崩等问题&#xff0c;本文将介绍这些问题的概念、原因以及解决方案。 缓存击穿 缓存击穿指…

SQL Server 连接查询和子查询

提示&#xff1a; 利用单表简单查询和多表高级查询技能&#xff0c;并且根据查询要求灵活使用内连接查询、外连接查询或子查询等。同时还利用内连接查询的两种格式、三种外连接查询语法格式和子查询的语法格式。 文章目录前言1.查询所有学生的学号、姓名、选修课程号和成绩方法…

Vue学习——【第四弹】

前言 上一篇文章 Vue学习——【第三弹】 中我们了解了MVVM模型&#xff0c;这篇文章接着学习Vue中的数据代理。 简单介绍 数据代理就是**一个对象(A)来代理对另一个对象(B)的属性操作(A一定要包含B)。**直接看定义大家可能觉得有些抽象&#xff0c;我们可以用代码来实现。 …

全景丨0基础学习VR全景制作,后期篇:嵌入视频前期注意事项及后期处理

大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 一、前期拍摄要点 嵌入视频的简介和用途 livepano即完全无缝融合到全景图中的热点嵌入视频。 这种无缝融合是真正无缝&#xff0c;从而让观者产生沉浸感和真实感。例如在场景中放入宠物、让喷泉动起来、灯光…

MPAM中PARTID的虚拟化(Virtualization)

MPAM支持对PARTID的virtualization&#xff0c;需要在满足所有以下条件下才能使用&#xff1a; 在当前的security状态下有实现EL2&#xff1b;支持MPAM virtualization&#xff0c;也就是MPAMIDR_EL1.HAS_HCR等于1&#xff1b; 以下是MPAM中使用virtual-to-physical PARTID ma…

Scala之面向对象

目录 Scala包&#xff1a; 基础语法&#xff1a; Scala包的三大作用&#xff1a; 包名的命名规范&#xff1a; 写包的好处&#xff1a; 包对象&#xff1a; 导包说明&#xff1a; 类和对象&#xff1a; 定义类&#xff1a; 封装&#xff1a; 构造器&#xff1a; 主从…

Spark 之 解析json的复杂和嵌套数据结构

本文主要使用以下几种方法&#xff1a; 1&#xff0c;get_json_object()&#xff1a;从一个json 字符串中根据指定的json 路径抽取一个json 对象 2&#xff0c;from_json()&#xff1a;从一个json 字符串中按照指定的schema格式抽取出来作为DataFrame的列 3&#xff0c;to_j…

【SpringMVC】第一个springmvc项目

需求&#xff1a; 用户在页面发起一个请求&#xff0c; 请求交给springmvc的控制器对象&#xff0c;并显示请求的处理结果&#xff08;在结果页面显示一个欢迎语句&#xff09;。 实现步骤&#xff1a; 新建web maven工程 加入依赖 spring-webmvc依赖&#xff0c;间接把spri…

FLINK 在蚂蚁大规模金融场景的平台建设

摘要&#xff1a;本文整理自蚂蚁集团高级技术专家、蚂蚁集团流计算平台负责人李志刚&#xff0c;在 Flink Forward Asia 2022 平台建设专场的分享。本篇内容主要分为四个部分&#xff1a; 主要挑战架构方案核心技术介绍未来规划点击查看直播回放和演讲 PPT 一、主要挑战 1.1 金…

【 Spring MVC 核心功能(三) - 输出数据】

文章目录引言一、返回静态页面二、返回非静态页面的数据三、返回 JSON 对象四、请求转发(forward)和请求重定向(redirect)五、拓展&#xff1a;IDEA 热部署(热加载)3.1 添加 SpringBoot DevTools 框架3.2 开起 IDEA 的自动编译3.3 开起运行中的热部署3.4 使用 debug 启动项目引…

【机器学习】SoftMax多分类---学习笔记

SoftMax---学习笔记softMax分类函数定义&#xff1a;softmax分类损失函数softMax分类函数 首先给一个图&#xff0c;这个图比较清晰地告诉大家softmax是怎么计算的。 (图片来自网络) 定义&#xff1a; 给定以歌nknknk矩阵W(w1,w2,...,wk)W(w_1,w_2,...,w_k)W(w1​,w2​,...,w…

Arcgis小技巧【12】——ArcGIS标注的各种用法和示例

标注是将描述性文本放置在地图中的要素上或要素旁的过程。 本文整理了ArcGIS中的各种标注方法、可能遇到的问题和细节&#xff0c;内容比较杂&#xff0c;想到哪写到哪。 一、正常标注某一字段值的内容 右键点击【属性】&#xff0c;在【标注】选项卡下勾选【标注此图层中的的…

Python 小型项目大全 1~5

一、百吉饼 原文&#xff1a;http://inventwithpython.com/bigbookpython/project1.html 在百吉饼这种演绎逻辑游戏中&#xff0c;你必须根据线索猜出一个秘密的三位数。该游戏提供以下提示之一来响应您的猜测&#xff1a;"Pico"&#xff0c;当您的猜测在错误的位置有…

【SpringMVC】7—文件上传

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…

布隆过滤器讲解及基于Guava BloomFilter案例

目录 1、布隆过滤器是什么 2、主要作用 3、存储过程 4、查询过程 5、布隆过滤器的删除操作 6、优点 7、缺点 8、测试误判案例 8.1、引入Guava依赖 8.2、编写测试代码 8.3、测试 8.4、BloomFilter实现原理 9、总结 推荐博主视频&#xff0c;讲的很棒&#xff1a;布隆…

华为运动健康服务Health Kit 6.10.0版本新增功能速览!

华为运动健康服务&#xff08;HUAWEI Health Kit&#xff09;6.10.0 版本新增的能力有哪些&#xff1f; 阅读本文寻找答案&#xff0c;一起加入运动健康服务生态大家庭&#xff01; 一、 支持三方应用查询用户测量的连续血糖数据 符合申请Health Kit服务中开发者申请资质要求…

大数据项目之电商数据仓库系统回顾

文章目录一、实训课题二、实训目的三、操作环境四、 实训过程&#xff08;实训内容及主要模块&#xff09;五、实训中用到的课程知识点六、实训中遇到的问题及解决方法七、课程实训体会与心得八、程序清单一、实训课题 大数据项目之电商数据仓库系统 二、实训目的 完成一个电…

7.基于概率距离快速削减法的风光场景生成与削减方法

matlab代码&#xff1a;基于概率距离快速削减法的风光场景生成与削减方法 采用蒙特卡洛进行场景生成&#xff0c;并再次进行场景缩减。 clear;clc; %风电出力预测均值E W[5.8,6.7,5.8,5.1,6.3,5,6.2,6,4.1,6,7,6.8,6.5,6.9,5,5.6,6,5.8,6.2,4.7,3.3,4.4,5.6,5]; %取标准差为风…

在unreal中的基于波叠加的波浪水面材质原理和制作

关于水的渲染模型 如何渲染出真实的水体和模拟&#xff0c;是图形学&#xff0c;游戏开发乃至仿真领域很有意思的一件事 记得小时候玩《Command & Conquer: Red Alert 3》&#xff0c;被当时的水面效果深深震撼&#xff0c;作为一款2008年出的游戏&#xff0c;现在想起它…