【Java8新特性】- Lambda表达式
Java8新特性 - Lambda表达式
生命不息,写作不止
继续踏上学习之路,学之分享笔记
总有一天我也能像各位大佬一样
一个有梦有戏的人 @怒放吧德德
分享学习心得,欢迎指正,大家一起学习成长!
简介
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。这是来自百度百科对lambda的介绍,实际上lambda就是简化了匿名函数的编写,只需一行代码就能代替繁杂的代码。
lambda主要是可以非常简洁的形式调用我们的匿名函数接口。
简单例子
首先声明一个接口,并且编写实现类实现这个接口
// UserService
public interface UserService {
void add();
}
// UserServiceImpl
public class UserServiceImpl implements UserService {
@Override
public void add() {
System.out.println("UserServiceImpl --- add");
}
}
一般来说是通过new实现类从而拿到实现中的add方法,如果通过new接口类就需要使用匿名内部类的形式调用接口。IDEA会提示使用lambda表达式。
如下代码可以看一下对比。
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
userService.add();
UserService user = new UserService() {
@Override
public void add() {
// 匿名内部接口业务逻辑
System.out.println("匿名内部接口业务逻辑");
}
};
// Lamdba表达式
UserService user2 = () -> System.out.println("匿名内部接口业务逻辑");
user2.add();
}
Lambda表达式的规范
Java中的Lambda表达式的规范,必须是为函数接口。
使用函数式接口
使用Lambda表达式依赖于函数式接口:
1、使用@FunctionalInterface注解来声明函数接口
2、在这个函数接口中只能有一个抽象方法
3、在函数接口中可以定义object类中的方法
4、可以有静态方法
*函数式接口(Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
更多函数式接口可以查看菜鸟联盟:https://www.runoob.com/java/java8-functional-interfaces.html
函数式接口的定义
通过@FunctionalInterface注解声明接口类,在java中也有许多内置的函数接口,详情看菜鸟联盟。
@FunctionalInterface // 声明函数式接口
public interface UserService {
void add();
String toString(); // Object类中的方法
static void hello() { // 静态方法
System.out.println("hello");
}
}
Lambda表达式的基础语法
表达式格式
(参数) -> {方法体}
格式说明
():存放参数,留空就代表没有参数。函数接口的参数列表,不需要写类型,需要定义参数名称。
->:是新引入的语法格式,代表指向动作。
{}:方法体
无参方法调用
在接口类中声明一个无参的抽象方法,通过lambda表达式来完成调用。()不需要存放参数,最后将会返回一个实现类对象。在通过调用对象的get方法。
// 匿名内部接口业务逻辑
UserService user2 = () -> System.out.println("匿名内部接口业务逻辑");
user2.get();
更加简便的写法
((UserService)() -> System.out.println("匿名内部接口业务逻辑")).get();
含参数方法调用
在MathService定义一个含有参数的抽象方法,原本的方式通过匿名内部接口。可以通过使用lambda表达式更加简便,并且可以省去{},也不需要return。
MathService math = new MathService() {
@Override
public Integer add(int a, int b) {
return a + b;
}
};
MathService mathService = (a, b) -> a + b;
System.out.println(mathService.add(1, 1));
方法引入
规则
方法引入需要遵循规范:方法参数列表、返回类型与函数接口参数列表与返回类型必须
要保持一致。
方法引入的规则:
静态方法引入: 类名::(静态)方法名称
对象方法引入: 类名:: 实例方法名称
实例方法引入:new对象 对象实例::方法引入
构造函数引入:类名::new
方法引用提供了非常有用的语法,可以直接引用已有的java类或对象的方法或构造器。方法引用其实也离不开Lambda表达式,
与lambda联合使用 ,方法引用可以使语言的构造更加紧凑简洁,减少冗余代码。方法引用提供非常有用的语法,可以直接引用已有的java类或者对象中方法或者构造函数,
方法引用需要配合Lambda表达式语法一起使用减少代码的冗余性问题。
实例
构造器引用
通过构造器引用实例化对象,
public static void main(String[] args) {
// 使用匿名内部类
CarService carService = new CarService() {
@Override
public Car getCar() {
return null;
}
};
// 使用引用方法
CarService car = Car::new;
car.getCar();
}
public class Car {
private String name;
private String brand;
public Car() {
}
}
public interface CarService {
Car getCar();
}
静态方法引入
UserService u = UserService::hello;
u.get();
在userservice中,有一个抽象get方法和一个静态方法
@FunctionalInterface
public interface UserService {
void get();
static void hello() {
System.out.println("hello");
}
}
运行后会输出hello
hello
Process finished with exit code 0
对象方法引入
这是一种更为方便的写法, 我记得在mybatis-plus使用自带条件查询的时候会用到这种方式,以下用简单例子来实现。java8中提供了public interface Function<T, R>的类,这个类也是使用@FunctionalInterface注解,可见也是函数式接口。
代码:
// 在car中声明一个方法
public class Car {
public String Info() {
return "保时捷 - 帕拉梅拉";
}
}
// 函数式接口
@FunctionalInterface
public interface CarInFoService {
String getCar(Car car);
}
测试采用了三种方式进行比较
public class LambdaTest4 {
public static void main(String[] args) {
System.out.println("**************匿名内部类**************");
CarInFoService carInFoService = new CarInFoService() {
@Override
public String getCar(Car car) {
return car.Info();
}
};
System.out.println(carInFoService.getCar(new Car()));
System.out.println("**************lambda**************");
CarInFoService carInFoService2 = (car) -> car.Info();
System.out.println(carInFoService2.getCar(new Car()));
System.out.println("**************对象方法引入**************");
CarInFoService carInFoService3 = Car::Info;
System.out.println(carInFoService3.getCar(new Car()));
// R apply(T t); T apply方法传递的参数类型 : R apply 方法返回的类型
Function<String, Integer> function = String::length;
System.out.println(function.apply("lyd_code"));
}
}
结果
Lambda表达式遍历
通过foreach循环遍历,forEach实际上需要使用匿名内部类Consumer<? super E>。
代码如下
public class LambdaTest5 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("lyd");
list.add("tom");
list.add("jack");
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println("name: " + s);
}
});
System.out.println("lambda表达式");
/**
* s:遍历链表所得到的元素字符串
*/
list.forEach(s -> System.out.println("name: " + s));
}
}
测试结果
Lambda排序
通过Comparator匿名内部类
public class LambdaTest6 {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("lyd", 99));
students.add(new Student("lkj", 55));
students.add(new Student("llm", 67));
students.add(new Student("lss", 87));
// students.sort(new Comparator<Student>() {
// @Override
// public int compare(Student o1, Student o2) {
// return o1.getScore() - o2.getScore();
// }
// });
students.sort((o1, o2) -> o1.getScore() - o2.getScore());
students.forEach(student -> System.out.println("name: " + student.getName() + " score: " + student.getScore()));
}
}
结果
为了写好博客,包括代码、文字,我是经过斟酌了的,如果有错误,欢迎指正!感谢观看!
创作不易,如有错误请指正,感谢观看!记得点赞哦!
【Java8新特性】- Lambda表达式的更多相关文章
- Java8新特性-Lambda表达式是什么?
目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...
- 乐字节-Java8新特性-Lambda表达式
上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...
- java8新特性——Lambda表达式
上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习.本文就从java8新特性中比较重要的Lambda表达式开 ...
- Java8新特性 - Lambda表达式 - 基本知识
A lambda expression is an unnamed block of code (or an unnamed function) with a list of formal param ...
- java8新特性-lambda表达式和stream API的简单使用
一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...
- Java8新特性: lambda 表达式介绍
一.lambda 表达式介绍 lambda 表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅. 比较官方的定义是这样的: lambda ...
- Java8 新特性lambda表达式(一)初始
本篇参考Richard Warburton的 java8 Lambdas :Functional Programming for the Masses 学习lambda表达式之前,需要知道什么是函数式 ...
- Java8新特性——Lambda 表达式
Lambda 表达式 Lambda 表达式的实质属于函数式编程. 语法格式为:(parameters) -> expression ...
- Java8新特性-Lambda表达式
1. 什么是Lambda表达式? Lambda表达式就是可以把函数作为参数传递,或者说把代码作为数据传递给函数. 2. Lambda表达式的语法格式 基本语法格式如下: 基本语法下多个变体的说明: ...
- Java8新特性——lambda表达式.(案例:词频统计)
需求:读入一个文本文件,确定所有单词的使用频率并从高到低排序,打印出所有单词及其频率的排序列表 先用传统方法解: package cn._1.wordfrequency; import java.ut ...
随机推荐
- CodeForce——Deltix Round, Autumn 2021 (open for everyone, rated, Div. 1 + Div. 2)前三道题目题解
目录 A: B: C: 题目链接 A Divide and Multiply standard input/output 1 s, 256 MB 正在上传-重新上传取消 x13036 B Willia ...
- [NOIP2015 提高组] 运输计划题解
题目链接:P2680 [NOIP2015 提高组] 运输计划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 看了好长时间题解才终于懂的,有关lca和二分答案的题解解释的不详细,一时 ...
- 匿名对象和private关键字
匿名内部类 没有名次的对象我们成为匿名对象 new Dog(); new Demo02().change(new Student("...")); 匿名对象的特点 如果对象只会被使 ...
- WPF 截图控件之绘制方框与椭圆(四) 「仿微信」
前言 接着上周写的截图控件继续更新 绘制方框与椭圆. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 正文 有开发者在B站反 ...
- 4G巴歇尔槽流量采集网关
首先向大家展示下拓扑图: 金鸽科技R10物联网网关,带有一个RS485口可以采集巴歇尔槽的液位状态,还提供一个网口用于给摄像头和现场其他的网络设备提供网络传输通道!R10A内置了巴歇尔槽液位换算成流量 ...
- axios&spring前后端分离传参规范总结
前后端分离开发的场景下,开发人员的工作内容更加专注与专业,但是也产生了一些额外的沟通成本.比如:本文中为大家说明的前后端参数传递与接受方法.本文主要是面对前端使用axios,后端使用Spring进行参 ...
- 自动挂载mount
# 自动挂载mount(/etc/fstab) /dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0 # 第一列:/dev/fd0 挂载源 ...
- Chapter 02 - Let's Get Started(C#篇)
详细解释,书上有哈.直接上代码和结果. Xcode下的自定义类 (通过new file-> cocoa class创建,保持和书中名字一样RandomController),自定义的fields ...
- WPF 实现带蒙版的 MessageBox 消息提示框
WPF 实现带蒙版的 MessageBox 消息提示框 WPF 实现带蒙版的 MessageBox 消息提示框 作者:WPFDevelopersOrg 原文链接: https://github.com ...
- 倒计时2日!基于 Apache DolphinScheduler&TiDB 的交叉开发实践,从编写到调度让你大幅提升效率
当大数据挖掘成为企业赖以生存.发展乃至转型的生命,如何找到一款好软件帮助企业满足需求,成为了许多大数据工程师困扰的问题.但在当下高速发展的大数据领域,光是一款好软件似乎都不足以满足所有场景业务需求,许 ...