文章目录

  • 1. Lambda表达式
    • 1.1 定义
    • 1.2 基本语法
    • 1.3 实现依据
    • 1.4 代码
  • 2. 函数式接口
    • 2.1 定义
    • 2.2 代码
      • 2.2.1 不带返回值的抽象方法
      • 2.2.2 带返回值的抽象方法
  • 3. 方法引用
    • 3.1 含义
    • 3.2 适用场景
    • 3.3 四种形式
    • 3.4 代码
      • 3.4.1 静态方法引用
      • 3.4.2 构造器引用
      • 3.4.3 类的任意对象的实例方法引用
      • 3.4.4 特定对象的实例方法引用
    • 3.4 建议

1. Lambda表达式

1.1 定义

lambda表达式是一个匿名函数,作为一种紧凑的代码风格,使它设计的代码会更简洁。

1.2 基本语法

(parameter...)->expression;
(parameter...)->{expression;}

1.3 实现依据

函数式接口保证了lambda表达式调用的接口只有一个需要实现的抽象方法,因此lambda参数可确定实现的抽象方法的返回值、方法名、参数类型,因此表达式中,上述内容均不需要书写,保证了代码的紧凑(参数类型可加可不加)。

jdk8版本,一些接口,如Runnable接口,默认添加的相应注解,可以直接使用此表达式。

1.4 代码

(1)原始实现方式

//原始方式
new Thread(new Runnable() {@Overridepublic void run() {//业务方法System.out.println("thread method...");}
}).start();

(2)lambda实现方式

new Thread(() -> {//业务方法System.out.println("thread method...");
}).start();

2. 函数式接口

2.1 定义

  • 关键字:接口注解@FunctionalInterface
  • 用途:可以用lambda表达式声明该类接口的实现
  • 定义:有且只有一个抽象方法,但是可以有很多个非抽象方法的接口
    • 有且只有一个抽象方法
    • 可以有default方法
    • 可以声明抽象方法覆盖java.lang.Object中的public方法

2.2 代码

2.2.1 不带返回值的抽象方法

(1)定义接口

@FunctionalInterface
public interface FunctionInterface{/*** 1、有且只有一个抽象方法*/void abstractMethod();/*** 2、可以有default方法*/default void defaultMethd(){System.out.println("default method");}/*** 3、可以声明抽象方法覆盖java.lang.Object中public方法*/String toString();
}

(2)lambda表达式调用接口

//(1)声明参数类型
FunctionalInterfaceTest function1=(String param)-> System.out.println("测试抽象方法1,参数:"+String.valueOf(param));//(2)不声明参数类型
FunctionalInterfaceTest function2=(param)->System.out.println("测试抽象方法2,参数:"+String.valueOf(param));//(3)带大括号(如抽象方法有返回值,必须采用此带“大括号”的方式)
FunctionalInterfaceTest function3=(param)->{System.out.println("测试抽象方法3,参数:"+String.valueOf(param));};
2.2.2 带返回值的抽象方法

(1)定义接口

@FunctionalInterface
public interface FunctionalInterfaceTest{/**
* 1、有且只有一个抽象方法
*/
String abstractMethod(String param);/**
* 2、可以有default方法
*/
default void defaultMethod(){System.out.println("default method");
}/**
* 3、可以声明抽象方法覆盖java.lang.Object中public方法
*/
String toString();
}

(2)lambda表达式调用接口

//(1)直接返回值
FunctionalInterfaceTest function1=(String param)->param;//(2)返回运算结果
FunctionalInterfaceTest function2=(param)->"接收参数:"+String.valueOf(param);//(3)带大括号
FunctionalInterfaceTest function3=(param)->{String result="接收参数"+param;return result;
};

3. 方法引用

3.1 含义

是一种语法糖,可以至今引用已有Java类或对象的方法或构造器,与lambda表达式结合使用,可以进一步简化代码

lambda表达式的部分场景可以使用方法引用进行替换,并不是所有的lambda表达式都可以使用方法引用。使用方法引用的地方都可以使用lambda替换。

3.2 适用场景

(1)lambda表达式的主题仅包含一个表达式,且表达式仅调用了一个已存在的方法。

(2)方法引用所使用方法的入参返回值与lambda表达式实现的函数式接口的入参返回值一致。

3.3 四种形式

类型 使用形式
静态方法引用 ClassName :: staticMethodName
构造器引用 ClassName :: new
类的任意对象的实例方法引用 ClassName :: instanceMethodName
特定对象的实例方法引用 object :: instanceMethodName

3.4 代码

3.4.1 静态方法引用

(1)语法格式:类名::静态方法名

(2)适用场景:适用于lambda表达式主体中只调用了某个类的静态方法

public class MethodReference1 {public static void main(String[] args) {//lambda表达式Arrays.asList("1","2","3").forEach((str)-> MethodReference1.staticMethod(str));//静态方法引用Arrays.asList("1","2","3").forEach(MethodReference1::staticMethod);}public static void staticMethod(String str){System.out.println(str);}
}
3.4.2 构造器引用

(1)语法格式:类名:new

(2)适用场景:lambda表达式主体中仅仅调用了某个类的构造函数返回实例的场景

3.4.3 类的任意对象的实例方法引用

未完待续…

3.4.4 特定对象的实例方法引用

未完待续…

3.4 建议

增大了代码的阅读难度,不建议使用

Jdk8之Lambda表达式相关推荐

  1. JDK8:Lambda表达式操作List集合

    JDK8的流对list的处理提供了很大的方便,特别是做报表的时候才能真正体现出来这个功能的强大:结合日常使用过程,有两个体会:一个是减少了数据库连接,最忌讳在循环中进行数据查询,特别是嵌套多层循环的时 ...

  2. Java关系表达式x y,java8--函数式接口,以及和Lambda表达式的关系

    一:函数式接口 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口(Single Abstract Method). jdk8的lambda表达式的函数式接口主要有: imag ...

  3. jdk8新特性 lambda表达式详解

    本文主要讲到的内容有: 一- 前言 二- 背景 三- lambda表达式的语法 四- Lambda程序例子 4-1 Runnable Lambda 4-2 Comparator Lambda 4-3 ...

  4. JDK8新特性之Lambda表达式

    转载自 JDK8新特性之Lambda表达式 什么是Lambda表达式 Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.当开发者在编写Lambda表达式时,也会随之被编译成 ...

  5. jdk8新特性(接口新特性、lambda表达式、方法引用、函数式接口、Stream流)和单例设计模式

    1.单例设计模式 1.概念: 设计模式:使用固有的流程或方式设计出来的类接口.枚举等元素 2.设计原则: 1.私有化构造方法[private.protected] 2.类中创建最终对象[唯一不能被赋值 ...

  6. JDK8新特性之Lambda表达式和四大函数接口

    在Java8中,加入了Lambda(Lambda expression),在使用它以前我们先聊聊为什么要加入Lamdba,使用它对于编程上有什么好处 一.Lamdba的作用 1.在我们需要把一些功能传 ...

  7. 熟悉JDK8新特性,“Lambda表达式与函数式接口”

    Hello,你好呀,我是大白(●-●) 菜单 lambda表达式 函数式接口 lambda表达式 lambda表达式可以看成匿名内部类的一个简洁写法 在语法上,Lambda表达式包含三个部分: 参数列 ...

  8. JDK8系列之Lambda表达式教程和示例

    JDK8系列之Lambda表达式教程和示例 1.Lambada 表达式简介 Lambda 表达式是一种匿名函数,但对Java中的Lambda表达式而已并不完全正确,简单来说,Lambda表达式是一种没 ...

  9. 【JDK8新特性】之Lambda表达式

    目录 Lambda表达式 1. 需求分析 2.Lambda表达式初体验 3. Lambda的语法规则 3.1 Lambda练习1 3.2 Lambda练习2 4. @FunctionalInterfa ...

最新文章

  1. c语言二级编程题库,二级C语言题库-编程题.doc
  2. Qt Creator嵌入式平台
  3. Codefroces1077F2. Pictures with Kittens (hard version)
  4. java future接口_java Future 接口介绍
  5. JavaScript中的“黑话”
  6. 全新版本的Tidy Up 5 Mac最新版!重复文件查找和磁盘清理工具
  7. sar —— Linux 上最为全面的系统性能分析工具之一
  8. Appium国内下载地址
  9. 小红伞杀毒软件|小红伞杀毒软件下载
  10. android 大文件查找,大文件查找软件(WizTree)
  11. 503热敏电阻温度阻值对应表
  12. Hive性能调优之Mapper和Reducer
  13. div实现页面划分为左,中,右三栏
  14. ESP32 LVGL8.1 ——msgbox 消息框 (msgbox 28)
  15. pr模板.mogrt格式安装方法
  16. 时尚简约风格的ae字幕条模板
  17. 优化器介绍—SGD、Adam、Adagrad
  18. Github标签管理
  19. win7打开仅计算机黑屏,黑屏只剩鼠标指针,详解win7打开电脑黑屏只剩鼠标指针的解决教程...
  20. markdown语法下

热门文章

  1. Containerd 的前世今生和级入门教程
  2. OpenStack概念结构与逻辑架构:Conceptual architecture and Logical architecture
  3. C语言骚操作:结构体初始化方法
  4. oracle数据库中分区表的效果是,分区表实际测试中发现并没有什么效果,帮忙看看问题出在哪里了???...
  5. python美化输出模块_美化输出结果之Python模块PrettyTable介绍
  6. android连接django(乱哄哄的)
  7. springcloud和dubbole的区别和解释
  8. java泛型中?和T有什么区别
  9. ros 发布信息频率_ROS 消息发布器和订阅器Publisher, Subscriber
  10. java实时监控数据变化_服务数据实时监控平台