今天我来聊聊 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 表达式、方法引用、函数式接口、默认方式、静态方法相关推荐

  1. 函数式接口 lambda表达式 方法引用

    拉呱: 终于,学习jdk8的新特性了,初体验带给我的感觉真爽,代码精简的不行,可读性也很好,而且,spring5也是把jdk8的融入到血液里,总之一句话吧,说的打趣一点,学的时候自己难受,学完了写出来 ...

  2. Lambda表达式接口更新方法引用函数式接口Stream流

    Lambda表达式&接口更新&方法引用&函数式接口&Stream流 Lambda 1.程序启动三种不同的表现形式 2.Lambda表达式的标准格式 3.练习 Lambd ...

  3. JDK1.8新特性之Lambda表达式+Stream流+函数式接口

    一.Lambda表达式 Lambda表达式,是JDK1.8引入的一种语法,这种语法可以对匿名内部类的写法,进行简写. 1.快速入门 package org.westos.demo2;import ja ...

  4. 十三、Java高级特性 Lambda表达式 | 接口组成更新 | 方法引用 | 函数式接口

    文章目录 十三.Java高级特性 1.Lambda表达式 1.1体验Lambda表达式[理解] 1.2Lambda表达式的标准格式[理解] 1.3Lambda表达式练习1[应用] 1.4Lambda表 ...

  5. Java Lambda(语言篇——lambda,方法引用,目标类型,默认方法,函数接口,变量捕获)

    深入理解Java 8 Lambda(语言篇--lambda,方法引用,目标类型和默认方法) 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout ...

  6. 学习笔记之-java8的新特性-函数式接口,lambda表达式,方法引用,Stream API,Optional类

    1.Lambda表达式 用匿名内部类的方法去创建多线程1.new Thread2.参数传递new Runnable3.重写run方法4.在run方法中去设置线程任务5.调用start问题:我们最终目标 ...

  7. java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量

    一提到java是一种什么语言? 大多数人肯定异口同声的说是一门面向对象的语言,这种观点从我们开始学java就已经根深蒂固了,但是学到java8新特性函数式编程的时候,我才知道java并不是纯面向对象的 ...

  8. Lambda表达式-常见的函数式接口

    目录 一.Runnable / Callable接口 二.Supplier 三.Consumer 四.Comparator 五.Predicate 六.Function 一.Runnable / Ca ...

  9. 三、jdk1.8新特新Lambda表达式方法引用

    前言 在之前我们接触了JDK1.8引入的新特新lambda表达式没在某种程度上,它可以简化我们的代码,帮助我们快速的编写代码,但在这其中我们之前的编写方式并不是lambda表达式最简洁的方式,而在头屑 ...

  10. 提高Java表达能力!不落伍一起掌握Java8中Lambda表达式、函数式接口及方法构造器数组引用

    文章目录 函数式接口概述 函数式接口示例 内置函数式接口 Lambda简述 Lambda语法 方法引用 构造器引用 数组引用 函数式接口概述 只包含一个抽象方法的接口,称为函数式接口. 可以通过 La ...

最新文章

  1. 我的家乡网页设计_Graphic Design|康石石浅谈LOGO设计在作品集中的创作方法
  2. 利用Log Explorer将你已经delete,truncate,drop过的数据进行恢复
  3. zookeeper原理与使用
  4. Ubuntu镜像国内下载地址
  5. 10 个理由让你继续干 IT
  6. 电大计算机应用基础考试复习,电大 《计算机应用基础》形考作业2
  7. python写一个笔记软件_科学网—python学习笔记(1)——创建应用 - 高雪峰的博文...
  8. basename 从绝对路径中取得文件名
  9. php+redis+保存多个值,php向redis list一次性lPush多个值
  10. 单片机STM32开发环境的安装
  11. python中的转义字符
  12. yang模型中rpc_RPC原理篇
  13. Vue项目引入animated
  14. CTF writeup 0_IDF实验室
  15. ossec是干什么的?
  16. 阿里云边缘云场景化商业实践
  17. 查询与退订中国移动短信服务
  18. 数据结构入门----遍历二叉树和线索二叉树
  19. 为什么全国计算机考小黑,稳住!我想你应该需要计算机二级考后须知
  20. 漫画照片在线生成?在线操作学习一下

热门文章

  1. Ajax缓存解决办法
  2. 关于4.8节第一个例子
  3. stm32f102 SPI口重复初始化引起的问题及解决办法
  4. AB1601编译优化参数引发的问题
  5. 文本挖掘预处理:向量化与Hash Trick
  6. python 语言教程(3)变量
  7. 跨链(8)跨链双雄Cosmos“系统框架”
  8. C++ Primer 5th笔记(chap 15 OOP)概述
  9. C++ Primer 5th笔记(10)chapter10 泛型算法 :write
  10. 深入了解Kubernetes CRD开发工具kubebuilder