Jdk8之Lambda表达式
文章目录
- 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表达式相关推荐
- JDK8:Lambda表达式操作List集合
JDK8的流对list的处理提供了很大的方便,特别是做报表的时候才能真正体现出来这个功能的强大:结合日常使用过程,有两个体会:一个是减少了数据库连接,最忌讳在循环中进行数据查询,特别是嵌套多层循环的时 ...
- Java关系表达式x y,java8--函数式接口,以及和Lambda表达式的关系
一:函数式接口 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口(Single Abstract Method). jdk8的lambda表达式的函数式接口主要有: imag ...
- jdk8新特性 lambda表达式详解
本文主要讲到的内容有: 一- 前言 二- 背景 三- lambda表达式的语法 四- Lambda程序例子 4-1 Runnable Lambda 4-2 Comparator Lambda 4-3 ...
- JDK8新特性之Lambda表达式
转载自 JDK8新特性之Lambda表达式 什么是Lambda表达式 Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.当开发者在编写Lambda表达式时,也会随之被编译成 ...
- jdk8新特性(接口新特性、lambda表达式、方法引用、函数式接口、Stream流)和单例设计模式
1.单例设计模式 1.概念: 设计模式:使用固有的流程或方式设计出来的类接口.枚举等元素 2.设计原则: 1.私有化构造方法[private.protected] 2.类中创建最终对象[唯一不能被赋值 ...
- JDK8新特性之Lambda表达式和四大函数接口
在Java8中,加入了Lambda(Lambda expression),在使用它以前我们先聊聊为什么要加入Lamdba,使用它对于编程上有什么好处 一.Lamdba的作用 1.在我们需要把一些功能传 ...
- 熟悉JDK8新特性,“Lambda表达式与函数式接口”
Hello,你好呀,我是大白(●-●) 菜单 lambda表达式 函数式接口 lambda表达式 lambda表达式可以看成匿名内部类的一个简洁写法 在语法上,Lambda表达式包含三个部分: 参数列 ...
- JDK8系列之Lambda表达式教程和示例
JDK8系列之Lambda表达式教程和示例 1.Lambada 表达式简介 Lambda 表达式是一种匿名函数,但对Java中的Lambda表达式而已并不完全正确,简单来说,Lambda表达式是一种没 ...
- 【JDK8新特性】之Lambda表达式
目录 Lambda表达式 1. 需求分析 2.Lambda表达式初体验 3. Lambda的语法规则 3.1 Lambda练习1 3.2 Lambda练习2 4. @FunctionalInterfa ...
最新文章
- c语言二级编程题库,二级C语言题库-编程题.doc
- Qt Creator嵌入式平台
- Codefroces1077F2. Pictures with Kittens (hard version)
- java future接口_java Future 接口介绍
- JavaScript中的“黑话”
- 全新版本的Tidy Up 5 Mac最新版!重复文件查找和磁盘清理工具
- sar —— Linux 上最为全面的系统性能分析工具之一
- Appium国内下载地址
- 小红伞杀毒软件|小红伞杀毒软件下载
- android 大文件查找,大文件查找软件(WizTree)
- 503热敏电阻温度阻值对应表
- Hive性能调优之Mapper和Reducer
- div实现页面划分为左,中,右三栏
- ESP32 LVGL8.1 ——msgbox 消息框 (msgbox 28)
- pr模板.mogrt格式安装方法
- 时尚简约风格的ae字幕条模板
- 优化器介绍—SGD、Adam、Adagrad
- Github标签管理
- win7打开仅计算机黑屏,黑屏只剩鼠标指针,详解win7打开电脑黑屏只剩鼠标指针的解决教程...
- markdown语法下
热门文章
- Containerd 的前世今生和级入门教程
- OpenStack概念结构与逻辑架构:Conceptual architecture and Logical architecture
- C语言骚操作:结构体初始化方法
- oracle数据库中分区表的效果是,分区表实际测试中发现并没有什么效果,帮忙看看问题出在哪里了???...
- python美化输出模块_美化输出结果之Python模块PrettyTable介绍
- android连接django(乱哄哄的)
- springcloud和dubbole的区别和解释
- java泛型中?和T有什么区别
- ros 发布信息频率_ROS 消息发布器和订阅器Publisher, Subscriber
- java实时监控数据变化_服务数据实时监控平台