一  引言

  现在java 10都已经出来了,而自己对java 8的一些新特性都不了解,很是惭愧,而且许多面试都有问到java8的新特性,借此博客好好学习这些新特性

二  新特性

  1 default关键字

  之前在面试的时候,问到接口和抽象类的区别,自己愚蠢回答一个接口不能写方法的实现,不出所料,接下来问了一个jdk 1.8的新特性的问题,说实话之前有了解过jdk1.8,但是项目中用的是低版本,所以不是很熟悉,接下让我们学习一下jdk 1.8新引入的关键字default,通过default修饰的方法,我们可以在接口写方法的实现

public interface Test01 {
public void test01(); public default void test02(){
System.out.println("我是新特性");
} }

这样做的意义为何?看一下官方给出的解释

The section Interfaces describes an example that involves manufacturers of computer-controlled cars who publish industry-standard interfaces that describe which methods can be invoked to operate their cars. What if those computer-controlled car manufacturers add new functionality, such as flight, to their cars? These manufacturers would need to specify new methods to enable other companies (such as electronic guidance instrument manufacturers) to adapt their software to flying cars. Where would these car manufacturers declare these new flight-related methods? If they add them to their original interfaces, then programmers who have implemented those interfaces would have to rewrite their implementations. If they add them as static methods, then programmers would regard them as utility methods, not as essential, core methods.

哈哈,看不懂吧,其实我也看不懂,我说一下大体意思,老项目中的一个接口已经有很多的实现类,如果想在这个接口添加的新的方法,而其他实现这个接口的实现类无疑要重写这个方法,对项目而言这是灾难的,当然我们可以定义一个静态的方法(static),实现类无需重写,但是static更多是使用方法,而非核心的方法,这是java的规范

  2 重头戏   Lambda表达式

  这里引入一个概念,函数式编程: (引网上的概念)函数式编程是一种抽象程度很高的编程范式,而且纯粹函数式编程语音编写的函数是没有变量的,因此对于一个函数只要输入明确,输出就是确定的,而且这种纯函数没有副作用的,而允许使用变量的函数,由于内部的变量的状态不确定,同样的输入,可能得到不同的结果,这种函数有副作用的

  jdk1.8新的特性lambda,这说明java尝试把函数式编程引入

List<String> names = Arrays.asList("aaa", "bbb", "ccc", "eee");
//之前我们这样写
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
//lambda
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
//还可以简化
Collections.sort(names, (String a, String b) -> b.compareTo(a));
//继续
Collections.sort(names, (a, b) -> b.compareTo(a));
System.out.println(names);
}

  引入lambda最大的感受就是大大的简化代码的开发,借鉴的像Scala,Python的等编程语言的特点,jdk1.8定义许多函数式接口,当然我们可以自定义函数式接口,详细后续讲解

  3  函数式接口

  函数式接口仅且只能包含一个抽象的方法的接口,每一个该类型的lambda的表达式都会匹配的这个抽象的方法上的,jdk1.8提供@FunctionalInterface注解来定义函数式接口

@FunctionalInterface
public interface Haha {
public int test(int a,int b);
}
public static void main(String[] args) {

        System.out.println(((Haha)(a,b) -> a+b).test(2,5));;

    }

  4 方法与构造函数引用

  jdk1.8提供一种方式通过::关键字来传递方法或者引用,下面通过::关键字引用静态方法

public interface A<T,F> {
F convert(T t);
} public static void main(String[] args) { A<String, Integer> t = Integer::valueOf;
Integer i = t.convert("111");
System.out.println(i);
}

输出结果为: 111

  通过::关键字::引用对象的方法,类的静态方法或者类的构造,进而赋给接口的中的(唯一)方法

class Person {
String firstName;
String lastName;
Person() {}
Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
} interface PersonFactory<P extends Person> {
P create(String firstName, String lastName);
} PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");

我们只需要使用 Person::new 来获取Person类构造函数的引用,Java编译器会自动根据PersonFactory.create方法的签名来选择合适的构造函数

JDK1.8 新特性详解的更多相关文章

  1. ES6,ES2105核心功能一览,js新特性详解

    ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...

  2. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  3. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  4. Java9 新特性 详解

    作者:木九天   <   Java9 新特性 详解  > Java9 新特性 详解 摘要: 1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方 ...

  5. 点击--》java9 新特性 详解

    引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为 ...

  6. java10 新特性 详解

    引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为 ...

  7. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

  8. Java8 Stream新特性详解及实战

    Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...

  9. JDK8新特性详解(二)

    Stream流的使用 流操作是Java8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的 API和新增Stream操作.Stream类中每一个方法都对应集合上的一 ...

随机推荐

  1. 使用 Jest 进行 Vue 单元测试

    本文介绍:1.vue-cli3下jest环境的搭建2.vue组件基本的测试方法 环境配置 vue-cli3 的插件使安装流程变得格外简单,通过 vue ui 启动可视化管理系统,在插件栏,点击 ‘添加 ...

  2. SpringBoot之整合Mybatis(增,改,删)

    一,在上一篇文章SpringBoot之整合Mybatis中,我们使用spring boot整合了Mybatis,并演示了查询操作.接下来我们将完善这个示例,增加增,删,改的功能. 二,改动代码 1.修 ...

  3. java.sql.SQLException: Data truncation: Incorrect string value: '\xE5\x91\xA8\xE6\x9D\xBE' for column 'cname' at row 1 Query

    在将项目上传到服务器时,发生这样的错误,总结了一下. 环境Centos7+tomcat7+Mariadb数据库 首先mysql -uroot -p 输入密码 然后查询数据库当前码表状态 show va ...

  4. 品Spring:详细解说bean后处理器

    一个小小的里程碑 首先感谢能看到本文的朋友,感谢你的一路陪伴. 如果每篇都认真看的话,会发现本系列以bean定义作为切入点,先是详细解说了什么是bean定义,接着又强调了bean定义为什么如此重要. ...

  5. layui-table 对表格数据进行处理之后的排序问题

    使用layui table过程中,将某一列的数据格式进行转换,或者将0/1状态改为是/否,或者将数字改为星星评分显示的时候都会遇到一个问题,我的表格数据转换成其他形式,同时设置了sort:true,此 ...

  6. JPA 已作废的SQLQuery.class、setResultTransformer方法替换

    1.hibernate 5.2 之后,SQLQuery.class.setResultTransformer方法已作废,其用法如下: Query query = entityManager.creat ...

  7. [数学基础]奇异值分解SVD

    之前看到过很多次奇异值分解这个概念,但我确实没有学过.大学线性代数课教的就是坨屎,我也没怎么去上课,后来查了点资料算是搞清楚了,现在写点东西总结一下. 奇异值分解,就是把一个矩阵拆成一组矩阵之和.在数 ...

  8. mysql高级扩展

    有关网址: MySQL 性能优化神器 Explain 使用分析 MySQL - EXPLAIN详解 1.时间比较 mysql> SELECT something FROM table WHERE ...

  9. CSS技巧(1)· CSS渐变 linear-gradient

    前言: 不论在网页设计中,还是传统的媒介中,各种尺寸,颜色,角度的图案在视觉中无处不在,要想在网页中实现复杂的图案,其过程往往不够理想,过去,我们可以创建一个单独的位图文件,然后每次需要做调整的时候, ...

  10. 集合线性表--List之ArrayList

    集合操作——线性表 List: add().remove().subList().list.toArray().array.asList(). List排序:  Collections.sort(li ...