文章目录

  • 函数式接口概述
  • 函数式接口示例
  • 内置函数式接口
  • Lambda简述
  • Lambda语法
  • 方法引用
  • 构造器引用
  • 数组引用

函数式接口概述

只包含一个抽象方法的接口,称为函数式接口。

可以通过 Lambda 表达式来创建该接口的对象。

可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。

在java.util.function包下定义了Java 8 的丰富的函数式接口。

在函数式编程语言当中,函数被当做一等公民对待。在将函数作为一等公民的编程语言中,Lambda表达式的类型是函数。但是在Java8中,有所不同。在Java8中,Lambda表达式是对象,而不是函数,它们必须依附于一类特别的对象类型——函数式接口。

简单的说,在Java8中,Lambda表达式就是一个函数式接口的实例。这就是Lambda表达式和函数式接口的关系。也就是说,只要一个对象是函数式接口的实例,那么该对象就可以用Lambda表达式来表示。所以用匿名实现类表示的现在都可以用Lambda表达式来写。


函数式接口示例

1、Runnable接口

2、自定义函数式接口

@FunctionalInterface
public interface MyFunctional01{public String getValue();
}//使用泛型
@FunctionalInterface
public interface MyFunctional02<T>{public T getValue(T t);
}

3、作为参数传递 Lambda 表达式

public class LambdaTest {public static void main(String[] args) {String newStr = toUpperString(str -> str.toUpperCase(),"abcDEf");System.out.println(newStr);}public static String toUpperString(MyFunc<String> my,String str){return my.getValue(str);}
}@FunctionalInterface
interface MyFunc<T>{public T getValue(T t);
}

内置函数式接口

import java.util.function.Consumer;/*** @Author: Yeman* @Date: 2021-10-03-22:50* @Description:*/
public class LambdaTest {public static void main(String[] args) {Consumer<Integer> consumer = i -> System.out.println(i);consumer.accept(9);}
}


Lambda简述

Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

其本质是作为函数式接口(只有一个抽象方法)的实例。

Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分:
①左侧:指定了 Lambda 表达式需要的参数列表。
②右侧:指定了 Lambda 体,是抽象方法的方法体。


Lambda语法

1、无参,无返回值

public class LambdaTest {public static void main(String[] args) {//未使用Lambda表达式Runnable runnable1 = new Runnable() {@Overridepublic void run() {System.out.println("这是第一个语法!");}};runnable1.run();System.out.println("======================");//使用Lambda表达式Runnable runnable2 = () -> {System.out.println("这是用了Lambda表达式的一个语法!");};runnable2.run();}
}

2、一个参数,无返回值

3、数据类型可以省略,因为可由编译器推断得出,称为“类型推断”

4、Lambda 若只需要一个参数时,参数的小括号可以省略

5、Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值

6、当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略


方法引用

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用。

方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。

要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致。

格式:使用操作符 “::” 将类(或对象)与方法名分隔开。

如下三种主要使用情况:
对象::非静态方法名
类::静态方法名
类::非静态方法名

示例:

import java.util.Comparator;
import java.util.function.Consumer;/*** @Author: Yeman* @Date: 2021-10-03-22:50* @Description:*/
public class LambdaTest {public static void main(String[] args) {Consumer<Integer> consumer = i -> System.out.println(i);consumer.accept(9);Consumer<String> stringConsumer = System.out :: println;stringConsumer.accept("Hello");Comparator<Integer> comparable = (x, y) -> Integer.compare(x,y);System.out.println(comparable.compare(2,9));Comparator<Integer> integerComparator = Integer :: compare;System.out.println(integerComparator.compare(9,2));}
}

构造器引用

格式:ClassName::new

与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,要求构造器参数列表要与接口中抽象方法的参数列表一致,且方法的返回值即为构造器对应类的对象。


数组引用

可以将数组看作一个类,则数组引用就类似于构造器引用。

格式:type[] :: new

import java.util.function.Function;/*** @Author: Yeman* @Date: 2021-10-03-22:50* @Description:*/
public class LambdaTest {public static void main(String[] args) {Function<Integer,String[]> function = length -> new String[length];String[] apply = function.apply(3);System.out.println(apply[2]);System.out.println("================");Function<Integer,String[]> function1 = String[] :: new;System.out.println(function1.apply(5));}
}

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

  1. java新特性-函数式接口-作为方法参数-作为方法的返回值-常用函数式接口-Supplier-Consumer-Predicate-Function

    文章目录 函数式接口 概念 函数式接口作为方法参数 函数式接口作为方法的返回值 常用函数式接口 Supplier接口 常用函数式接口 Consumer 函数式接口之 Predicate接口 常用接口之 ...

  2. Java中Lambda表达式使用及详解

    Java中Lambda表达式使用及详解 前言 一.Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中.使 ...

  3. 能力素质有所欠缺_孩子说话啰嗦没重点?家长学会“大脑整理术”,提高孩子表达能力...

    文丨萱妈(文章原创 ,版权归本人所有,欢迎妈妈们转发分享) 引言 相信很多父母在孩子学说话的过程中,都会发现孩子的表达能力似乎有所欠缺,明明是一些很简单的问题,但到了孩子嘴里,就变成了复杂且难以理解的 ...

  4. 提高沟通表达能力该看什么书?有哪些沟通书籍值得推荐?

    提高沟通表达能力该看什么书?有哪些沟通书籍值得推荐? 提高沟通表达能力的书籍,我只推荐你看这一本:<沟通与说服必读12篇>. 并且仅此一本就足够了. 之前我也看过很多沟通方面的书籍,并且几 ...

  5. 口才演讲范文:提高口头表达能力的技巧

    在日常生活交往中,人们更多的是使用口头语言,所以,口头语言比书面语言起着更直接的.更广泛的交际作用.现代社会的发展,对人的口头表达能力提出了越来越高的要求.接下来大印文化与你分享如何掌握这些技巧,能进 ...

  6. Java中Lambda表达式和stream的使用

    Java中Lambda表达式和stream的使用 转自 [*https://www.cnblogs.com/franson-2016/p/5593080.html*] 简介 (译者注:虽然看着很先进, ...

  7. Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)

    Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...

  8. 【CSDN软件工程师能力认证学习精选】 Java8新特性学习-函数式编程(Stream/Function/Optional/Consumer)

    CSDN软件工程师能力认证是由CSDN制定并推出的一个能力认证标准,宗旨是让一流的技术人才凭真才实学进大厂拿高薪,同时为企业节约大量招聘与培养成本,使命是提升高校大学生的技术能力,为行业提供人才储备, ...

  9. Java基础二十二:函数式接口介绍,函数式接口作为方法参数、返回值,Supplier接口、Consumer接口、Predicate接口、Function接口基本介绍及其案例小练习

    函数式接口 1. 函数式接口概念及基本使用 1.函数式接口:有且仅有一个抽象方法的接口,函数式接口就是Lambda表达式使用的前提 2. Java中的函数式编程体现的就是Lambda表达式,所以函数式 ...

最新文章

  1. 揭开SAP Fiori编程模型规范里注解的神秘面纱 - @OData.publish工作原理解析
  2. idea的英文是什么意思_idealisation是什么意思中文翻译
  3. Windows环境下配置thrift编译器(VS2015)
  4. 第三章 寄存器(内存访问)
  5. python中的doctest_Python测试框架doctest
  6. 怎么理解Condition
  7. 【转】java线程池的原理和机制
  8. c语言设计题库及详解答案,c语言程序设计题库及其答案
  9. Pycharm安装中文语言插件
  10. 职中c语言课程,C语言课件下载【深圳职业技术学院】
  11. 超级计算机卫星云图,台风路径实时发布系统20号台风云图 台风艾莎尼高清卫星云图实时追踪...
  12. html修改字体大小到10像素,ps怎么修改字体大小
  13. 奥克兰计算机科学专业世界排名,新西兰计算机专业大学排名
  14. iOS 微信支付开发(最新版)
  15. 惠普硬盘测试工具_短DST未通过,详细教您惠普笔记本如何检测硬盘
  16. 时序因果分析算法(THP)学习与代码分析
  17. 考研英语 长难句训练day65
  18. oracle 导出身份证号_ORACLE对身份证号码处理相关的SQL汇总
  19. Excel ODBC导入器 驱动程序报错解决方式
  20. 问题解决zipimport.ZipImportError: can‘t decompress data; zlib not availabl

热门文章

  1. Google App Engine:在您自己的域中托管应用程序
  2. 如何取消高亮显示重复项_如何将重复数据突出显示?
  3. Windows 系统下通过命令将本地文件上传至远程 Linux 主机的指定目录下
  4. 美式英语中 [d] 的特别发音
  5. Linux 命令之 iwconfig 命令-配置无线网络接口
  6. 如何维护笔记本电脑的电池
  7. ioc spring 上机案例_通过实例解析Spring Ioc项目实现过程
  8. 在c语言中引用数组元素时,其数组下标的数据类型允许是什么
  9. C语言520心形表白,初学者福利!!
  10. Linux下CMAKE编译jsoncpp,使用CMake引入jsoncpp