在现代编程世界中,函数式编程范式正变得越来越受欢迎。Java 8引入了Lambda表达式,为Java开发者提供了强大的函数式编程能力。Lambda表达式以其简洁、灵活和高效的特性,在Java开发中发挥着重要作用。本篇博客将深入探讨Java Lambda的概念、用法以及它如何帮助我们编写更优雅、可维护的代码。
- Lambda函数式编程:是一种思想特点。
- 函数式编程思想,忽略面向对象的复杂语法,强调做什么,而不是谁去做。
下面我们一起来学习一下吧:
Lambda标准格式
() -> {}
():对应这方法的形参
->:固定格式
{}:对应着方法的方法体
- 注意:
- Lambda表达式可以用来简化匿名内部类的书写
- Lambda表达式只能简化函数式接口的匿名内部类的写法
- 函数式接口:
- 有且仅有一个抽象方法的接口叫做函数式接口,接口上方可以加@Functionalnterface注解
Lambda初步体验
我们先来看一下用匿名内部类改写的方法:
首先定义有个方法和有个接口
方法
public static void method(Swim s){
s.swimming();
}
接口
interface Swim{
public abstract void swimming();
}
然后使用匿名内部类去改写方法
csharp
// 1.利用匿名内部类的形式去调用下面的方法。
//调用一个方法的时候,如果方法的形参是一个接口,那么我们要传递这个接口的实现类对象
//如果实现类对象只要用到一次,就可以用匿名内部类的形式进行书写
method(new Swim() {
@Override
public void swimming() {
System.out.println("匿名内部类改写的:正在游泳!");
}
});
我们下面再来用Lambda表达式改写一下看看:
scss
// 2.利用Lambda表达式进行改写
method(() -> {
System.out.println("Lambda表达式改写的:正在游泳!");
});
是不是两个方法改写的游泳都出来了呀,那你觉得是哪个比较方便呢?那肯定是Lambda表达式呀对不对。
下面我们再来说一下有且仅有一个抽象方法的接口叫做函数式接口
是什么意思,我们首先在接口上面加上注解:
这个时候接口里面只有一个抽象方法,注解是不是没有报错呀,那我们再加有个抽象方法看一下:
当出现了两个抽象方法的时候注解是不是就报错了呀!所以这点需要注意的!
下面我们来做个小结吧:
-
Lambda表达式的基本作用
- 简化函数式接口的匿名内部类的写法。
-
Lambda表达式有什么使用前提
- 必须是接口的匿名内部类,接口中只能有一个抽象方法
-
Lambda的好处
- Lambda是一个匿名函数(方法),我们可以把Lambda表达式理解为是一段R可以传递的代码,它可以写出更简洁、更灵活的代码,作为一种更紧凑的代码风格,使ava语言表达能力得到了提升
其实Lambda表达式还可以省略写法,我们一起接着看吧:
Lambda省略写法
省略核心:可推导,可省略
简单点理解就是:凡是可以推导出来的东西都可以省略不写。
我们还是来看上面那个例子:
1.利用匿名内部类的形式改写方法。
csharp
method(new Swim() {
@Override
public void swimming() {
System.out.println("匿名内部类改写的:正在游泳!");
}
});
2.利用Lambda表达式完整写法进行改写
erlang
method(() -> {
System.out.println("Lambda表达式改写的:正在游泳!");
});
而我们在用Lambda表达式省略写法改写看一下效果:
erlang
method(() -> System.out.println("Lambda表达式省略改写的:正在游泳!"));
是不是一行代码直接搞定了呀,怎么样方不方便呢!下面我们来做个小结吧:
- lambda的省略规则
- 参数类型可以省略不写。
- 如果只有一个参数,参数类型可以省略,同时()也可以省略。
- 如果Lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略。
下面我们来做个小小案例来看一下Lambda表达式有多方便吧:
Lambda案例
需求:定义数组并存储一些字符串,利用Arrays中的sort方法进行排序。
要求:按照字符串的长度进行排序,短的在前面,长的在后面。
现在有这样一个数组:String[] arr = {"a","aaa","aaaaa","aa","aaaa"};
如果以后我们要把数组中的数据按照指定的方式进行排列,就需要用到sort方法,而且要指定排序的规则
我们先用匿名内部类的写法看一下
typescript
// 匿名内部类的格式
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
再来用Lambda表达式的完整格式:
rust
// Lambda表达式的完整格式
Arrays.sort(arr,(String o1, String o2)-> {
return o1.length() - o2.length();
}
);
最后用Lambda表达式省略写法:
scss
// Lambda表达式的省略格式
Arrays.sort(arr, (o1,o2)-> o1.length() - o2.length());
我们来运行看一下:
怎么样,Lambda表达式省略写法是不是更简化代码了呀!
好啦,关于Lambda表达式我们就学习到这里,有什么不懂的可以在评论区互相评论探讨哟,我们下期不见不散!!!
==最后非常感谢您的阅读,也希望能得到您的反馈 ==