java 8 特点_Java8的特性有哪些
展开全部
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的特性有哪些相关推荐
- java新应用_java8新特性的实际应用
Java8自从14年发布之后增加了很多新特性,其中好多特性在实际应用中都可以用到,不仅简化了我们代码,还弥补了旧版本里的一些不足.这里只列举出一些实际开发中可能用得到的特性,加以说明. 函数式接口 函 ...
- java stream 有序_Java8新特性之Stream流专题四 并行流
随着对流API认识的慢慢深入,本章我们要讨论的知识点是流API里面的并行流了. 在开始讨论并行流之前,我先引发一下大家的思考,就你看到这篇文章的时间,你们是不是经常听到,Intel i7 CPU什么8 ...
- java lambda 变量_java8新特性-lambda(变量捕获)
1.匿名内部类中的变量捕获 public class App { String s1 = "全局变量"; public void testInnerClass() { String ...
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一导读
前 言 致读者 本书是按照Java SE 8完全更新后的<Java核心技术 卷Ⅱ 高级特性(原书第10版)>.卷Ⅰ主要介绍了Java语言的一些关键特性:而本卷主要介绍编程人员进行专业软件开 ...
- 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 ...
- 【Java】《Java面向对象编程的三大特性》阅读笔记
前言 偶然读到这篇文章(<Java面向对象编程的三大特性>),想来这也算论文?这种还不满网络都是?读罢觉得写得还真不错,这里以我愚见,简单点评一二,不足之处还望指教. 阅读笔记 笔记1 文 ...
- Java 11 正式发布,新特性解读
Java 11 正式发布,新特性解读 杨晓峰 2018 年 9 月 26 日 话题:Java语言 & 开发 不知不觉 JDK 11 已经发布了,从 9 开始,JDK 进入了让人学不动的更新 ...
- java的发展(8-17新特性整理)
java java的诞生与历史: 简介:Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征. ...
- java functionex_Atitit. atiJavaExConverter4js 新的特性
Atitit. atiJavaExConverter4js 新的特性 1.1. V1新特性 Java ex convert 1.2. V2 新特性 Catch 不同的ex 2. Keyword Tr ...
- JAVA语言的优点及特性
JAVA语言的优点及特性 Java语言有8大优势 JAVA的三大特性 Java语言有8大优势 广泛性 Java是使用最多的编程语言之一 简单性 java语言的语法与C和C++接近.学习简单,好使用. ...
最新文章
- 分别用BFS和DFS求给定的矩阵中“块”的个数
- ffmpeg openh264
- 在 VS Code 中轻松 review GitHub Pull Requests
- Centos7 查看/关闭/启动防火墙
- python代码技巧_几个小技巧让你的Python代码更Pythonic
- Ubuntu: 不显示无线连接 Can't get wireless working on Dell latitude d620
- 介绍一款界面自动化的工具
- Android4.4之Camera2预览流程APP到Driver(十四)
- Linux学习(4)vim编辑器的安装使用
- 星环大数据 学习笔记(76) —— Kafka 运维常用命令
- WinRAR压缩加密
- antd table input 失焦的问题
- 离线安装keras的主要步骤
- SpringCloud版本Hoxton SR5 --- 第二讲:eureka 、eureka与zookeeper的区别与使用场景。
- 计算机专业mac好用吗,苹果笔记本电脑系统好用吗_苹果笔记本电脑系统好用不好用-win7之家...
- 未将对象引用设置到对象的实例 解决办法
- 无法打开登录所请求的数据库 xxx。登录失败。用户 'AAA' 登录失败。
- 超越卷积、自注意力机制:强大的神经网络新算子involution(连算子都内卷= =)
- 常用连续型随机变量的概率分布表(附概率密度函数全域积分等于1、期望、方差的推导与证明)
- 美德乐吸奶器怎么样?
热门文章
- [ Front-end ] Iframe 跨域双向通信
- windows2003手工安装配置php5详细指南
- 妙用javascript
- c++拼接字符串效率比较(+=、append、stringstream、sprintf)
- 181024词霸有道扇贝每日一句
- Noteexpress更新文献时总出现重复的文献----有人知道怎么解决吗?请多多指教!
- Atitit 网盘使用法 艾提拉著 目录 1. 需要解决几个问题	2 1.1. 多关键词搜索的问题 使用every索引解决	2 1.2. 重要文具类索引使用分类索引 日志 crm类增加000前缀
- Atitit react 详细使用总结 绑定列表显示 attilax总结 1. 前言	1 1.1. 资料数量在百度内的数量对比	1 1.2. 版本16 v15.6.1	1 1.3. 引入js	2
- Atitit Atitit 零食erp数据管理---世界著名零食系列数据.docx世界著名零食
- Atitit 图像处理知识点 知识体系 知识图谱v2