展开全部

1、函数式接口

Java 8 引入的一个核心概念是函数式接口(Functional Interfaces)。通过在接口里面添加一个抽象方62616964757a686964616fe4b893e5b19e31333363373764法,这些方法可以直接从接口中运行。如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。同时,引入了一个新的注解:@FunctionalInterface。可以把他它放在一个接口前,表示这个接口是一个函数式接口。这个注解是非必须的,只要接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解 @FunctionalInterface 进行声明。在接口中添加了 @FunctionalInterface 的接口,只允许有一个抽象方法,否则编译器也会报错。

java.lang.Runnable 就是一个函数式接口。

@FunctionalInterface

public interface Runnable {

public abstract void run();

}

2、Lambda 表达式

函数式接口的重要属性是:我们能够使用 Lambda 实例化它们,Lambda 表达式让你能够将函数作为方法参数,或者将代码作为数据对待。Lambda 表达式的引入给开发者带来了不少优点:在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,Lambda 表达式的应用则使代码变得更加紧凑,可读性增强;Lambda 表达式使并行操作大集合变得很方便,可以充分发挥多核 CPU 的优势,更易于为多核处理器编写代码;

Lambda 表达式由三个部分组成:第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;第二部分为一个箭头符号:->;第三部分为方法体,可以是表达式和代码块。语法如下:

1. 方法体为表达式,该表达式的值作为返回值返回。

(parameters) -> expression

2. 方法体为代码块,必须用 {} 来包裹起来,且需要一个 return 返回值,但若函数式接口里面方法返回值是 void,则无需返回值。

(parameters) -> { statements; }

例如,下面是使用匿名内部类和 Lambda 表达式的代码比较。

下面是用匿名内部类的代码:

button.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

System.out.print("Helllo Lambda in actionPerformed");

}

});

下面是使用 Lambda 表达式后:

button.addActionListener(

\\actionPerformed 有一个参数 e 传入,所以用 (ActionEvent e)

(ActionEvent e)->

System.out.print("Helllo Lambda in actionPerformed")

);

上面是方法体包含了参数传入 (ActionEvent e),如果没有参数则只需 ( ),例如 Thread 中的 run 方法就没有参数传入,当它使用 Lambda 表达式后:

Thread t = new Thread(

\\run 没有参数传入,所以用 (), 后面用 {} 包起方法体

() -> {

System.out.println("Hello from a thread in run");

}

);

通过上面两个代码的比较可以发现使用 Lambda 表达式可以简化代码,并提高代码的可读性。

为了进一步简化 Lambda 表达式,可以使用方法引用。例如,下面三种分别是使用内部类,使用 Lambda 表示式和使用方法引用方式的比较:

//1. 使用内部类

Function f = new Function(){

@Override

public String apply(Integer t) {

return null;

}

};

//2. 使用 Lambda 表达式

Function f2 = (t)->String.valueOf(t);

//3. 使用方法引用的方式

Function f1 = String::valueOf;

要使用 Lambda 表达式,需要定义一个函数式接口,这样往往会让程序充斥着过量的仅为 Lambda 表达式服务的函数式接口。为了减少这样过量的函数式接口,Java 8 在 java.util.function 中增加了不少新的函数式通用接口。例如:

Function:将 T 作为输入,返回 R 作为输出,他还包含了和其他函数组合的默认方法。

Predicate :将 T 作为输入,返回一个布尔值作为输出,该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(与、或、非)。

Consumer :将 T 作为输入,不返回任何内容,表示在单个参数上的操作。

例如,People 类中有一个方法 getMaleList 需要获取男性的列表,这里需要定义一个函数式接口 PersonInterface:

interface PersonInterface {

public boolean test(Person person);

}

public class People {

private List persons= new ArrayList();

public List getMaleList(PersonInterface filter) {

List res = new ArrayList();

persons.forEach(

(Person person) ->

{

if (filter.test(person)) {//调用 PersonInterface 的方法

res.add(person);

}

}

);

return res;

}

}

为了去除 PersonInterface 这个函数式接口,可以用通用函数式接口 Predicate 替代如下:

class People{

private List persons= new ArrayList();

public List getMaleList(Predicate predicate) {

List res = new ArrayList();

persons.forEach(

person -> {

if (predicate.test(person)) {//调用 Predicate 的抽象方法 test

res.add(person);

}

});

return res;

}

}

3、接口的增强

Java 8 对接口做了进一步的增强。在接口中可以添加使用 default 关键字修饰的非抽象方法。还可以在接口中定义静态方法。如今,接口看上去与抽象类的功能越来越类似了。

默认方法

Java 8 还允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法。在实现该接口时,该默认扩展方法在子类上可以直接使用,它的使用方式类似于抽象类中非抽象成员方法。但扩展方法不能够重载 Object 中的方法。例如:toString、equals、 hashCode 不能在接口中被重载。

例如,下面接口中定义了一个默认方法 count(),该方法可以在子类中直接使用。

public interface DefaultFunInterface {

//定义默认方法 countdefault int count(){

return 1;

}

}

public class SubDefaultFunClass implements DefaultFunInterface {

public static void main(String[] args){

//实例化一个子类对象,改子类对象可以直接调用父接口中的默认方法 count

SubDefaultFunClass sub = new SubDefaultFunClass();

sub.count();

}

}

静态方法

在接口中,还允许定义静态的方法。接口中的静态方法可以直接用接口来调用。

例如,下面接口中定义了一个静态方法 find,该方法可以直接用 StaticFunInterface .find() 来调用。

public interface StaticFunInterface {public static int find(){

return 1;

}

}

public class TestStaticFun {

public static void main(String[] args){

//接口中定义了静态方法 find 直接被调用

StaticFunInterface.fine();

}

}

本回答由网友推荐

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

java 8 特点_Java8的特性有哪些相关推荐

  1. java新应用_java8新特性的实际应用

    Java8自从14年发布之后增加了很多新特性,其中好多特性在实际应用中都可以用到,不仅简化了我们代码,还弥补了旧版本里的一些不足.这里只列举出一些实际开发中可能用得到的特性,加以说明. 函数式接口 函 ...

  2. java stream 有序_Java8新特性之Stream流专题四 并行流

    随着对流API认识的慢慢深入,本章我们要讨论的知识点是流API里面的并行流了. 在开始讨论并行流之前,我先引发一下大家的思考,就你看到这篇文章的时间,你们是不是经常听到,Intel i7 CPU什么8 ...

  3. java lambda 变量_java8新特性-lambda(变量捕获)

    1.匿名内部类中的变量捕获 public class App { String s1 = "全局变量"; public void testInnerClass() { String ...

  4. 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一导读

    前 言 致读者 本书是按照Java SE 8完全更新后的<Java核心技术 卷Ⅱ 高级特性(原书第10版)>.卷Ⅰ主要介绍了Java语言的一些关键特性:而本卷主要介绍编程人员进行专业软件开 ...

  5. JavaSE、JavaEE、JavaME、jdk、jre、jvm、java主要的11个特性

    文章目录 1.JavaSE.JavaEE.JavaME是什么? 2.jdk.jre.jvm是什么? 3.java主要的11个特性 1.JavaSE.JavaEE.JavaME是什么? JavaSE(J ...

  6. 【Java】《Java面向对象编程的三大特性》阅读笔记

    前言 偶然读到这篇文章(<Java面向对象编程的三大特性>),想来这也算论文?这种还不满网络都是?读罢觉得写得还真不错,这里以我愚见,简单点评一二,不足之处还望指教. 阅读笔记 笔记1 文 ...

  7. Java 11 正式发布,新特性解读

    Java 11 正式发布,新特性解读 杨晓峰   2018 年 9 月 26 日 话题:Java语言 & 开发 不知不觉 JDK 11 已经发布了,从 9 开始,JDK 进入了让人学不动的更新 ...

  8. java的发展(8-17新特性整理)

    java java的诞生与历史: 简介:Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征. ...

  9. java functionex_Atitit. atiJavaExConverter4js  新的特性

    Atitit. atiJavaExConverter4js  新的特性 1.1. V1新特性 Java ex convert 1.2. V2 新特性 Catch 不同的ex 2. Keyword Tr ...

  10. JAVA语言的优点及特性

    JAVA语言的优点及特性 Java语言有8大优势 JAVA的三大特性 Java语言有8大优势 广泛性 Java是使用最多的编程语言之一 简单性 java语言的语法与C和C++接近.学习简单,好使用. ...

最新文章

  1. 分别用BFS和DFS求给定的矩阵中“块”的个数
  2. ffmpeg openh264
  3. 在 VS Code 中轻松 review GitHub Pull Requests
  4. Centos7 查看/关闭/启动防火墙
  5. python代码技巧_几个小技巧让你的Python代码更Pythonic
  6. Ubuntu: 不显示无线连接 Can't get wireless working on Dell latitude d620
  7. 介绍一款界面自动化的工具
  8. Android4.4之Camera2预览流程APP到Driver(十四)
  9. Linux学习(4)vim编辑器的安装使用
  10. 星环大数据 学习笔记(76) —— Kafka 运维常用命令
  11. WinRAR压缩加密
  12. antd table input 失焦的问题
  13. 离线安装keras的主要步骤
  14. SpringCloud版本Hoxton SR5 --- 第二讲:eureka 、eureka与zookeeper的区别与使用场景。
  15. 计算机专业mac好用吗,苹果笔记本电脑系统好用吗_苹果笔记本电脑系统好用不好用-win7之家...
  16. 未将对象引用设置到对象的实例 解决办法
  17. 无法打开登录所请求的数据库 xxx。登录失败。用户 'AAA' 登录失败。
  18. 超越卷积、自注意力机制:强大的神经网络新算子involution(连算子都内卷= =)
  19. 常用连续型随机变量的概率分布表(附概率密度函数全域积分等于1、期望、方差的推导与证明)
  20. 美德乐吸奶器怎么样?

热门文章

  1. [ Front-end ] Iframe 跨域双向通信
  2. windows2003手工安装配置php5详细指南
  3. 妙用javascript
  4. c++拼接字符串效率比较(+=、append、stringstream、sprintf)
  5. 181024词霸有道扇贝每日一句
  6. Noteexpress更新文献时总出现重复的文献----有人知道怎么解决吗?请多多指教!
  7. Atitit 网盘使用法 艾提拉著 目录 1. 需要解决几个问题 2 1.1. 多关键词搜索的问题 使用every索引解决 2 1.2. 重要文具类索引使用分类索引 日志 crm类增加000前缀
  8. Atitit react 详细使用总结 绑定列表显示 attilax总结 1. 前言 1 1.1. 资料数量在百度内的数量对比 1 1.2. 版本16 v15.6.1 1 1.3. 引入js 2
  9. Atitit Atitit 零食erp数据管理---世界著名零食系列数据.docx世界著名零食
  10. Atitit 图像处理知识点  知识体系 知识图谱v2