详解JDK 9中的新特性
学习笔记 : 详解JDK 9中的新特性由于 JDK9 中下面两个特性很重要,所有小哥我就单独分开写啦~
详解JDK 9中的新特性 : JDK 9目录结构的变化及新特性之模块化
详解JDK 9中的新特性 : JDK 9新特性之REPL(JShell)
接口的私有方法Java 8 中规定接口中的方法除了抽象方法之外,还可以定义静态和默认的方法. 一定程度上扩展了接口的功能,此时的接口更像是一个抽象类. 而在 Java 9 中,接口更加的灵活和强大,连方法的访问权限修饰符都可以声明为 private 的了,此时方法将不会成为你对外暴露的 API 的一部分,话说这个语法的改进不应该在 Java 8 中就施行的嘛~ 示例程序如下 :
1234567891011121314151617181920212223242526272829303132333435363738394041424344package pers.huangyuhui.jdk9;import org.junit.Test;//注:其方法的默认权限为public哟interface MyInterface { ...
JDK 9新特性之REPL( JShell )
学习笔记 : JDK 9新特性之REPL( JShell )产生背景像 Python 和 Scala之类的语言早就有交互式编程环境 REPL( read-evaluate-print-loop )了,以交互式的方式对语句和表达式进行求值,开发者只需要输入一些代码,就可以在编译前获得对程序的反馈. 而之前的 Java 版本想要执行代码,必须创建文件,声明类,提供测试方法才可以实现,而现在使用 JShell( 既写既的,快速运行 ) 就可以摆脱这种困扰咯~
实现目标
Java9 终于拥有了 REPL 工具 JShell : 既而可以让 Java 可以像脚本语言一样运行,从控制台启动 JShell,利用 JShell 在没有创建类的情况下直接声明变量,计算表达式,执行语句. 既开发时可以在命令行里直接运行Java的代码,而无需再创建 Java 文件,无需再使用 public static void main(String[]args)这句废话
JShell 也可以从文件中加载语句或将语句保存到文件中
JShell 也可以是 tab 键进行自动补全和自动添加分号
基本使用JShell 中的命 ...
JDK 9目录结构的变化及新特性之模块化
学习笔记 : JDK 9目录结构的变化及新特性之模块化目录结构JDK 9( JDK 9以后的版本 )的具体目录结构如下所示 :
bin : 该目录包含所有的命令
conf : 包含用户可以编辑的配置文件,例如以前位于jre\lib 目录中的 .properties 和 .policy 文件
include : 包含一些编译本地代码时使用的C/C++头文件
jmods : 包含JMOD 格式的平台模块,创建自定义运行映射时需要它
legal : 包含法律声明
lib : 包含非 Windows 平台上动态链接的本地库,其子目录和文件不应由开发人员直接编辑或使用
注 : JDK9 目录中不再有jre子目录
模块化系统Java 9最大的变化之一是引入了模块系统( Jigsaw 项目 ),主要原因是Java和相关生态在不断丰富的同时越来越暴露一些问题 :
Java 运行环境的膨胀和臃肿. 每次加载 JVM 启动时,至少会有 30 ~ 60MB 内存加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被 classloader 加载,第一步整个 jar 都会被 JVM 加载到内存当 ...
JDK 9新特性概述
学习笔记 : JDK 9新特性概述简介⏳ 来看一下Java成立到Java 9版本发布的时间线吧,不得不说比我还大三岁哟~
1990年初, 最初被命名为Oak
1995年5月23日, Java语言诞生
1996年1月, 第一个JDK-JDK1.0诞生
1996年4月, 10个最主要的操作系统供应商申明将在其产品中嵌入Java技术
1996年9月, 约8.3万个网页应用了Java技术来制作
1997年2月18日, JDK1.1发布
1997年4月2日, JavaOne会议召开, 参与者逾一万人, 创当时全球同类会议纪录
1997年9月, JavaDeveloperConnection 社区成员超过十万
1998年2月, JDK1.1被下载超过2,000,000次
1998年12月8日, Java 2企业平台J2EE发布
1999年6月, SUN公司发布Java三个版本 : 标准版(J2SE)、企业版(J2EE)和微型版(J2ME)
2000年5月8日, JDK1.3发布
2000年5月29日, JDK1.4发布
2001年6月5日, Nokia宣布到2003年将出售1亿部支持Java的手 ...
JDK 8新特性之默认方法的基本使用
学习笔记 : JDK 8新特性之默认方法的基本使用简介Java 8 新增了接口的默认方法,简单点说既默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法. 我们只需在方法名前面加个 default 关键字即可实现默认方法的定义哟~ 那为什么要引入这个特性呢 ? 解答如下 :
1首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程. 缺陷是当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现. 然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现. 所以引进的默认方法,他们的目的是为了解决接口的修改与现有的实现不兼容的问题
接口默认方法的类优先原则 : 若一个接口中定义了一个默认方法,而另一个父类或接口中又定义了一个同名的方法时,可分为情况 :
选择父类中的方法 : 如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略
接口冲突 : 如果一个父接口提供了一个默认方法,而另一个接口也提供了一个具有相同名称和 ...
JDK 8新特性之Optional类的基本使用
学习笔记 : JDK 8新特性之Optional类的基本使用简介到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因. 以前为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方法来防止代码受污染,它鼓励程序员写更干净的代码~ 受到Google Guava的启发,Option类已经成为Java 8类库的一部分. java.util.Optional<T>是一个容器类,它可以保存类型为T的值,代表这个值存在. 或者仅仅保存null,表示这个值不存在. 原来用null表示一个值不存在,现在Optional可以更好的表达这个概念,并且可以避免空指针异常~
Optional类的javadoc对其的描述为 : 这是一个可以为null的容器对象,如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象
类方法
static <T> Optional<T> empty() : 返回空的 Optional 实例
boolean equals(Object o ...
JDK 8新特性之Stream流的基本使用案例
学习笔记 : JDK 8新特性之Stream流的基本使用案例题目现有两个ArrayList集合分别存储着若干个元素,要求 : 一使用传统的for循环 / 增强for循环依次进行以下若干操作步骤, 二使用Stream流的方式依次进行以下若干操作步骤,相信最后你定会体会到Stream的美 (✪ω✪)~
第一个集合只要包含’E’字符的元素,并将其存储到一个新集合中
第一个集合筛选之后只要前3个元素,并将其存储到新集合中
第二个集合只要包含’K’字符的元素,并将其存储到新集合中
第二个集合筛选之后不要前2两个元素,并将其存储到一个新集合中
将两个集合合并成一个集合,并存储到一个新集合中
根据合并后的集合中的元素值创建Element对象,并将其存储到新集合中
打印整个集合的Element对象信息
解答传统方式的代码实现1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 ...
JDK 8新特性之Stream流的基本使用
学习笔记 : JDK 8新特性之Stream流的基本使用简介Java 8 API添加了一个新的抽象称为Stream流,其让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象. 其 API 可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码. 其把将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选,排序,聚合等, 元素流在管道中经过中间操作 (intermediate operation) 的处理,最后由最终操作 (terminal operation) 得到前面处理的结果
123+--------------------+ +------+ +------+ +---+ +-------+| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|+--------------------+ + ...
JDK 8新特性之方法引用
学习笔记 : JDK 8新特性之方法引用简介当要传递给Lambda体的操作已经有实现的方法时,就可以使用方法引用咯~ 方法引用可以看做是Lambda表达式深层的表达,换句话说 : 方法引用就是Lambda表达式,既函数式接口的一个实例,通过方法的名字来指定一个方法,可以认为是Lambda表达式的一个语法糖~
要求实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致
格式使用操作符 :: 将类(或对象)与方法名分隔开来
语法
对象 :: 实例方法名
类 :: 静态方法名
类 :: 实例方法名
基本使用下面通过一个简单的程序示例,来对比Lambda表达式与方法引用写法之间的区别 :
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950package pers.huangyuhui.method;import org.junit.Ignore;import org.junit.Test;//定义一个函数式接口@Functi ...
JDK 8新特性之函数式接口的基本使用
学习笔记 : JDK 8新特性之函数式接口的基本使用简介函数式接口是整个 Lambda 表达式的一个根源,换句话来说 Java8 中的 Lambda 表达式要想彻底掌握,前提是要彻底理解好函数式接口哟,那么什么是函数接口呢 ? 答 : 函数式接口 (Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口,函数式接口可以被隐式转换为 Lambda 表达式. 注 : 我们可以通过在接口上使用 @FunctionalInterface 注解来检查它是否是一个函数接口. Java8中丰富的函数式接口都定义在 Java.util.function 包中哟~
Java内置四大核心函数式接口
函数式接口
参数类型
返回类型
用途
Consumer<T> 消费性接口
T
void
对类型为T的对象应用操作,包含方法: void accept(T t)
Supplier<T> 供给性接口
无
T
返回类型为T的对象,包含方法: T get()
Function<T,R> 函数型接口
T
R
对类型为T ...