一、Lambda

1.1 函数式编程

与面向对象不同,后者是先去找到对象,然后让对象去调用成员方法。而在下方的例子中我我们更关心的是排序的规则,不管什么对象去做就都可以,受限于面向对象的语法特点,不得不去创建一个匿名内部类,再通过这类去创建对象,重写里面的抽象方法才能利用这个规则。而函数式编程就可以忽略这个特点。

1.2 Lambda表达式的标准格式

🌟 1.2.1、Lambda 表达式是什么?

Lambda 表达式(Lambda Expression) 是 Java 8 引入的一种简洁写法,用于表示匿名函数(没有名字的函数),主要用来简化函数式接口的实现

✅ 核心目的:
  • 让代码更简洁
  • 支持函数式编程风格
  • 配合 Stream API 实现高效数据处理

💡 一句话理解:
“Lambda 就是把‘怎么做’直接写成一行代码,而不是写一个完整的类或方法。”

1.2.2 什么是函数式接口?

  • 只有一个抽象方法 的接口
  • 可以用 @FunctionalInterface 注解标记(非必须,但推荐)

Lambda 只能用于“函数式接口”

1.2.3 代码演示

package com.lkbhua.Algorithm.LambdaDemo;

public class demo2 {
    public static void main(String[] args) {
        /*
            Lambda表达式的注意点:
                1、Lambda表达式可以用来简化匿名内部类,其他地方不能用
                2、Lambda表达式只能简化函数式接口的匿名内部类的写法
                3、函数式接口:
                    有且只有一个抽象方法的接口叫函数式接口,接口上方可以@functionInterface注解*/

        // 1、利用匿名内部类的形式去调用下面的方法
        // 调用一个方法的时候,如果方法的形参是一个接口,那么我们要传递这个接口的实现类对象
        // 如果实现类对象只要用到一次,就可以用匿名内部类
        // new不是这个接口,而是后面这个没有名字的类的对象
        // 这个没有名字的类:是实现了这个Swim接口
        // 那么这个整体就可以看作是Swim的实现类对象
        method(new Swim() {
            @Override
            public void swim() {
                System.out.println("匿名内部类");
            }
        });


        // 2、利用Lambda表达式进行改写
        // 必须是函数式接口(接口,是其他的抽象类都不行)
        method(() -> {
            System.out.println("Lambda表达式");
        });

    }
    public static void method(Swim s){
        s.swim();
    }
}

@FunctionalInterface
interface Swim{
    public abstract void swim();
    //public abstract void show(){
    //    System.out.println("默认方法");
    // }
}

1.3 Lambda表达式的省略写法

package com.lkbhua.Algorithm.LambdaDemo;

import java.util.Arrays;
import java.util.Comparator;

public class demo {
    public static void main(String[] args) {
        /*
             Lambda表达式的省略规则
                1、参数类型可以省略不写
                2、如果只有一个参数,参数类型可以省略,同时()也可以省略
                3、如果Lambda表达式的方法只有一行,大括号、分号、return可以省略不写,需要同时省略*/

        Integer[] arr = {1,2,3,4,5,6,7,8,9};

        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });

        // 完整的Lambda表达
        Arrays.sort(arr, (Integer o1, Integer o2) -> {
            return o1 - o2;
        });

        // Lambda表达式省略步骤1
        // 核心思想:可推导的,即可省略
        // 1、参数类型可以省略不写——因为都是相同的参数类型Integer
        Arrays.sort(arr, ( o1, o2) -> {
            return o1 - o2;
        });

        // Lambda表达式省略步骤2
        // 3、如果Lambda表达式的方法只有一行,大括号、分号、return可以省略不写
        Arrays.sort(arr, ( o1, o2) -> o1 - o2);
        
        System.out.println(Arrays.toString(arr));
    }
}

1.4 练习

package com.lkbhua.Algorithm.LambdaDemo;

import java.util.Arrays;
import java.util.Comparator;

public class test1 {
    public static void main(String[] args) {
        /*
            定义数组并存储一些字符串,利用Arrays中的sort方法进行排序
            需求:
                按照字符串的长度进行排序,短的在前面,长的在后面
                (暂时不比较字符串里面的内容)*/

        String[] arr = {"aaa","aa","aaAa","aaAaa"};

        // 如果我们以后要把数组中的数据按照指定的方式进行排列,就需要用到sort方法,而且按照指定的规则
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length() - o2.length();
            }
        });

        // Lambda表达式
        Arrays.sort(arr,(String o1,String o2)->{
            return o1.length() - o2.length();
        });
        
        // Lambda表达式省略
        Arrays.sort(arr, ( o1,  o2) -> o1.length() - o2.length()
        );

        // 打印
        System.out.println(Arrays.toString(arr));

    }
}

“Lambda 不是为了炫技,而是为了让逻辑更清晰。”
它是现代 Java 开发的基础技能,也是通往 Stream API、响应式编程的大门。

声明:

题目详细分析借鉴于通义AI

以上均来源于B站@ITheima的教学内容!!!

本人跟着视频内容学习,整理知识引用

更多推荐