lambda表达式

发布时间 2023-09-09 11:49:22作者: SimpleWord
title: Lambda表达式
index_img: https://picss.sunbangyan.cn/2023/07/30/stdtw2.jpg
tags:
  - Java SE
categories:
  - Java SE
excerpt: Lambda表达式

格式

  • 不关心是谁调用方法,方法是什么,关心方法本身(参数和方法体)
  • 只能用于函数式接口的匿名内部类
    • 函数式接口:有且只有一个抽象方法的接口,接口上可以加上@FunctionalInterface注解
()->{

}
  • ()方法形参
  • ->固定格式
  • {}方法体
  • 参数类型可以不写
  • 如果只有一个参数,参数类型和()都可以省略
  • 如果方法体只有一行
    • 是return,则return、{}、;都可以省略
    • 不是return,则{}、;可以省略

案例1

public class Main {
    public static void main(String[] args) {
        Integer[] num = {1, 2, 5, 4, 3};
        Arrays.sort(num, new Comparator<Integer>() {
            @Override
            public int compare(Integer t1, Integer t2) {
                return t2 - t1;
            }
        });
        System.out.println(Arrays.toString(num));//[5, 4, 3, 2, 1]
    }
}

改进

  • 去掉对象相关: new Comparator<Integer>()
  • 去掉方法名:public int compare
  • 保留参数和方法体,加上->
    • 去除参数类型
    • 去除return、{}、;
public class Main {
    public static void main(String[] args) {
        Integer[] num = {1, 2, 5, 4, 3};
        Arrays.sort(num, (t1, t2) -> t2 - t1);
        System.out.println(Arrays.toString(num));//[5, 4, 3, 2, 1]
    }
}

案例2

@FunctionalInterface
interface Swim {
    public abstract void swimming(String name);
}

public class Main {
    public static void main(String[] args) {

        //这里匿名内部类实现了Swim接口(重写了抽象方法)
        method(new Swim() {
            @Override
            public void swimming(String name) {
                System.out.println(name + "游泳");
            }
        });
    }

    public static void method(Swim s) {//这里是接口多态,运行看右边
        s.swimming("小鱼"); //小鱼游泳
    }
}

改进

  • 去掉new Swim()
  • 去掉Swimming
  • 保留参数和方法体
    • 去除()和参数类型
    • 去除{}、;
@FunctionalInterface
interface Swim {
    public abstract void swimming(String name);
}

public class Main {
    public static void main(String[] args) {

        //这里匿名内部类实现了Swim接口(重写了抽象方法)
        method(name -> System.out.println(name + "游泳"));
    }

    public static void method(Swim s) {//传入的参数是匿名内部类本身,并通过匿名内部类调用重写方法
        s.swimming("小鱼"); //小鱼游泳
    }
}