Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法
今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的,这篇文章就来聊聊这些新特性。
lambda 表达式
lambda 表达式在项目中也是用到了,这种新的语法的加入,对于使用 Java 多年的我,我觉得是如虎添翼的感觉哈,这种新的语法,大大的改善了以前的 Java 的代码,变得更加的简洁,我觉得这也是为什么 Java8 能够很快的流行起来的原因吧。
这里我们用几个以前的经典的 Java 的写法和用 lambda 表达式的方式进行对比。
线程的用法
原始的线程用法
//使用匿名内部类的方式启动多线程new Thread(new Runnable() {@Overridepublic void run() {System.out.println("这是使用匿名内部类的方式。。。");}}).start();
lambda 表达式
//使用lambda表达式方式new Thread(() -> {System.out.println("这是使用lambda表达式的方式。。。");}).start();
你会发现,用 lambda 表达式的方式能够写更少的代码,看起来也会更加的舒服和简洁。
这里没有使用参数,只是一个简单的例子。
我们再看一个例子。
遍历方式
原始方式
//原始方式List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);for (int i : list) {System.out.println(i);}
lambda 表达式方式
//使用lambda表达式代替foreach循环Stream.of(1, 2, 3, 4, 5).forEach((x) -> {System.out.println(x);});
在原始的方式中,我们一般使用 foreach 的方式进行遍历,有了 Java8 的方式之后,我们可以用 forEach
方法,然后,再用 lambda 表达式的方式进行遍历,也让原来的方式变得更加的简洁。
在这个例子中,我们加了一个参数,在()
中间我们加了一个 x
,代表的意思其实是:通过 forEach
方法,我们把一个元素已经赋值到 x
中了,拿到这个 x
,我们就可以输出结果。
总结
lambda 的使用方式其实很简单,可以总结为下面的方法。
([参数可选,...]) -> {}
方法引用
方法引用其实是 lambda 表达式的部分的简化,也就是为了简化 lambda 表达式而存在的感觉,下面我们还讲讲怎么使用方法引用。
/*** @return void* @Author ouyangsihai* @Description 方法引用测试* @Date 10:23 2019/5/14* @Param []**/@Testpublic void test_method_reference() {//使用lambda表达式Stream.of("A", "BB", "CCC", "DDDD", "FFFFF").map(s -> s.length()) //lambda.forEach((x) -> {System.out.println(x);});//使用静态方法引用Stream.of("A", "BB", "CCC", "DDDD", "FFFFF").map(String::length) //静态方法引用.forEach((x) -> {System.out.println(x);});//使用实例方法引用Stream.of(new ClassMate("1", "欧阳思海"),new ClassMate("2", "sihai")).map(ClassMate::getName)//实例方法引用.forEach(x -> {System.out.println(x);});}
在第一个测试中,我们用的是 lambda 表达式来获取每个字符串的长度。
s -> s.length()
在第二个测试中,我们使用的是静态方法引用来获取每个字符串的长度。
String::length
在第三个测试中,我们使用的是实例方法引用。
ClassMate::getName
解释
① map 方法是映射的意思。
② forEach 方式是遍历每一个元素。
③ ClassMate 是一个包含 id 和 name 的简单 po 类。
通过上面这个例子,基本上我们就知道怎么使用方法引用了。下面我们进行一个小的总结。
总结
① 使用方法
类名::方法名
② 方法可以是:静态方法,实例方法
构造函数引用
在上面我们讲了方法引用的基本使用方法,其实除了方法引用以外,还有构造函数引用,回想一下,以前我们创建对象是怎么做?是不是需要 new 一个对象呢,那么现在用构造函数引用又是怎么做的呢?
下面我们用一个例子讲解一下,在这个例子中,对象还是使用上面的 ClassMate
。
/*** @return void* @Author ouyangsihai* @Description 构造函数引用测试* @Date 10:23 2019/5/14* @Param []**/@Testpublic void test_method_reference2() {//使用lambda表达式Stream.of("A", "BB", "CCC", "DDDD", "FFFFF").map(s -> new ClassMate(s)) //lambda.collect(Collectors.toList());//使用构造函数引用Stream.of("A", "BB", "CCC", "DDDD", "FFFFF").map(ClassMate::new) //构造函数引用,由上下文决定用哪一个构造函数.collect(Collectors.toList());}
① 第一个我们使用的是 lambda 表达式进行创建对象的 s -> new ClassMate(s)
。
② 第二个我们使用的是构造函数引用创建对象的 ClassMate::new
。
③ 我们发现构造函数引用:类名::new
,然后对于使用哪一个构造函数是由上下文决定的,比如有一个参数和两个参数和无参数的构造函数,会自动确定用哪一个。
接口
在 Java 8 之前的接口是不能有实现的,只能定义抽象方法,然而,在 Java 8 以后,增加了一个新的功能,可以添加实现,可以定义默认方法,可以定义静态方法。
函数式接口
什么是函数式接口呢?
这个名词在 Java 中以前是很少听到的,但是正是有了 Java 8 的横空出世,函数式编程也变得熟悉了。
在一个接口中我们以 @FunctionalInterface
注解声明一个接口,并且接口中只有一个抽象方法,那么我们就叫做这是一个函数式接口。
/*** @ClassName FunctionalInterfaceTest* @Description* @Author 欧阳思海* @Date 2019/5/14 10:39* @Version 1.0**/
@FunctionalInterface
public interface FunctionalInterfaceTest {//继承接口后,又加了新的抽象方法,这个接口就不再是函数式接口void test(String s);
}
① 上面的接口中只有一个抽象方法,所以这是一个函数式接口。
② 如果上面接口中再加一个抽象方法,那么就不是函数式接口了。
下面,我们再通过继承来继承这个接口。
/*** @ClassName FunctionalTest* @Description* @Author 欧阳思海* @Date 2019/5/17 17:26* @Version 1.0**/
public interface FunctionalTest extends FunctionalInterfaceTest{int test2();
}
① 我们继承了上面的接口,并且加了一个 test2
方法。
② 这里注意,如果一个接口集成现有的函数式接口后,又加了其他的抽象方法,这个接口就不是函数式接口了。
默认方法
默认方法很简单,用 default
声明即可。
/*** @ClassName FunctionalInterfaceTest* @Description* @Author 欧阳思海* @Date 2019/5/14 10:39* @Version 1.0**/
@FunctionalInterface
public interface FunctionalInterfaceTest {//继承接口后,又加了新的抽象方法,这个接口就不再是函数式接口void test(String s);//默认方法default String getStr(){return null;}
}
① 在接口中添加了一个默认方法。并且实现了方法。
静态方法
默认方法很简单,用 static
声明即可。
/*** @ClassName FunctionalInterfaceTest* @Description* @Author 欧阳思海* @Date 2019/5/14 10:39* @Version 1.0**/
@FunctionalInterface
public interface FunctionalInterfaceTest {//继承接口后,又加了新的抽象方法,这个接口就不再是函数式接口void test(String s);//静态方法static String getStr2(){return null;}//错误用法default static String getStr3(){return null;}
}
① 实现的静态方法,用 static
声明。
② 注意不能同时使用 default 和 static 声明。
总结
在这篇文章中,我们讲了 lambda 表达式、方法引用、函数式接口、接口中的静态方法、接口中的默认方法的使用。
Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法相关推荐
- 函数式接口 lambda表达式 方法引用
拉呱: 终于,学习jdk8的新特性了,初体验带给我的感觉真爽,代码精简的不行,可读性也很好,而且,spring5也是把jdk8的融入到血液里,总之一句话吧,说的打趣一点,学的时候自己难受,学完了写出来 ...
- Lambda表达式接口更新方法引用函数式接口Stream流
Lambda表达式&接口更新&方法引用&函数式接口&Stream流 Lambda 1.程序启动三种不同的表现形式 2.Lambda表达式的标准格式 3.练习 Lambd ...
- JDK1.8新特性之Lambda表达式+Stream流+函数式接口
一.Lambda表达式 Lambda表达式,是JDK1.8引入的一种语法,这种语法可以对匿名内部类的写法,进行简写. 1.快速入门 package org.westos.demo2;import ja ...
- 十三、Java高级特性 Lambda表达式 | 接口组成更新 | 方法引用 | 函数式接口
文章目录 十三.Java高级特性 1.Lambda表达式 1.1体验Lambda表达式[理解] 1.2Lambda表达式的标准格式[理解] 1.3Lambda表达式练习1[应用] 1.4Lambda表 ...
- Java Lambda(语言篇——lambda,方法引用,目标类型,默认方法,函数接口,变量捕获)
深入理解Java 8 Lambda(语言篇--lambda,方法引用,目标类型和默认方法) 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout ...
- 学习笔记之-java8的新特性-函数式接口,lambda表达式,方法引用,Stream API,Optional类
1.Lambda表达式 用匿名内部类的方法去创建多线程1.new Thread2.参数传递new Runnable3.重写run方法4.在run方法中去设置线程任务5.调用start问题:我们最终目标 ...
- java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量
一提到java是一种什么语言? 大多数人肯定异口同声的说是一门面向对象的语言,这种观点从我们开始学java就已经根深蒂固了,但是学到java8新特性函数式编程的时候,我才知道java并不是纯面向对象的 ...
- Lambda表达式-常见的函数式接口
目录 一.Runnable / Callable接口 二.Supplier 三.Consumer 四.Comparator 五.Predicate 六.Function 一.Runnable / Ca ...
- 三、jdk1.8新特新Lambda表达式方法引用
前言 在之前我们接触了JDK1.8引入的新特新lambda表达式没在某种程度上,它可以简化我们的代码,帮助我们快速的编写代码,但在这其中我们之前的编写方式并不是lambda表达式最简洁的方式,而在头屑 ...
- 提高Java表达能力!不落伍一起掌握Java8中Lambda表达式、函数式接口及方法构造器数组引用
文章目录 函数式接口概述 函数式接口示例 内置函数式接口 Lambda简述 Lambda语法 方法引用 构造器引用 数组引用 函数式接口概述 只包含一个抽象方法的接口,称为函数式接口. 可以通过 La ...
最新文章
- 我的家乡网页设计_Graphic Design|康石石浅谈LOGO设计在作品集中的创作方法
- 利用Log Explorer将你已经delete,truncate,drop过的数据进行恢复
- zookeeper原理与使用
- Ubuntu镜像国内下载地址
- 10 个理由让你继续干 IT
- 电大计算机应用基础考试复习,电大 《计算机应用基础》形考作业2
- python写一个笔记软件_科学网—python学习笔记(1)——创建应用 - 高雪峰的博文...
- basename 从绝对路径中取得文件名
- php+redis+保存多个值,php向redis list一次性lPush多个值
- 单片机STM32开发环境的安装
- python中的转义字符
- yang模型中rpc_RPC原理篇
- Vue项目引入animated
- CTF writeup 0_IDF实验室
- ossec是干什么的?
- 阿里云边缘云场景化商业实践
- 查询与退订中国移动短信服务
- 数据结构入门----遍历二叉树和线索二叉树
- 为什么全国计算机考小黑,稳住!我想你应该需要计算机二级考后须知
- 漫画照片在线生成?在线操作学习一下