从零开始学Java-Lambda

在现代编程世界中,函数式编程范式正变得越来越受欢迎。Java 8引入了Lambda表达式,为Java开发者提供了强大的函数式编程能力。Lambda表达式以其简洁、灵活和高效的特性,在Java开发中发挥着重要作用。本篇博客将深入探讨Java Lambda的概念、用法以及它如何帮助我们编写更优雅、可维护的代码。

  • Lambda函数式编程:是一种思想特点
  • 函数式编程思想,忽略面向对象的复杂语法,强调做什么,而不是谁去做

下面我们一起来学习一下吧:

Lambda标准格式

() -> {}

  1. ():对应这方法的形参
  2. ->:固定格式
  3. {}:对应着方法的方法体
  • 注意:
    • 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的省略规则
    1. 参数类型可以省略不写。
    2. 如果只有一个参数,参数类型可以省略,同时()也可以省略。
    3. 如果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表达式我们就学习到这里,有什么不懂的可以在评论区互相评论探讨哟,我们下期不见不散!!!

==最后非常感谢您的阅读,也希望能得到您的反馈 ==

相关推荐
mghio1 小时前
Dubbo 中的集群容错
java·微服务·dubbo
Asthenia04121 小时前
Spring AOP 和 Aware:在Bean实例化后-调用BeanPostProcessor开始工作!在初始化方法执行之前!
后端
Asthenia04122 小时前
什么是消除直接左递归 - 编译原理解析
后端
Asthenia04122 小时前
什么是自上而下分析 - 编译原理剖析
后端
Asthenia04123 小时前
什么是语法分析 - 编译原理基础
后端
Asthenia04123 小时前
理解词法分析与LEX:编译器的守门人
后端
uhakadotcom3 小时前
视频直播与视频点播:基础知识与应用场景
后端·面试·架构
Asthenia04124 小时前
Spring扩展点与工具类获取容器Bean-基于ApplicationContextAware实现非IOC容器中调用IOC的Bean
后端
bobz9654 小时前
ovs patch port 对比 veth pair
后端