Lambda表达式简单学习

本文深入探讨Java8中Lambda表达式的概念、语法及应用场景,包括基础语法、方法引用、构造方法引用、案例分析以及常用函数式接口介绍,助力开发者掌握这一强大特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:lambda表达式简介
Lambda表达式是Java8中新添加的一个特性,说白了就是一个匿名函数。使用lambda表达式可以对一个接口进行非常简洁的实现。
Lambda表达式可以对函数式接口进行简洁的实现,但并不是所有的接口都可以使用Lambda表达式。函数式接口:只有一个抽象方法的接口。
备注1:在Java8中对接口增加了一个新特性,default。增加此关键字后,可以对接口进行实现,也可以不对接口进行实现。
备注2:@FunctionalIinterface这个注解是用来修饰函数式接口的,修饰后只能有一个抽象接口。

二:函数式接口的几种类型(以下为代码示例)
1:无返回值多个参数

@FunctionalInterface
public interface LambdaNoneReturnMutipleParameter {
    void test(int a,int b);
}

2:无返回值无参数

@FunctionalInterface
public interface LambdaNoneReturnNoneParameter {
    void test();
}

3:无返回值单个参数

@FunctionalInterface
public interface LambdaNoneReturnSingleParameter {
    void test(int a);
}

4:有返回值无参数

@FunctionalInterface
public interface LambdaSingleReturnNoneParameter {
    int test();
}

5:有返回值单个参数

@FunctionalInterface
public interface LambdaSingleReturnSingleParameter {
    int test(int a);
}

6:有返回值多个参数

@FunctionalInterface
public interface LambdaSingleReturnMutipleParmeter {
    int test(int a,int b);
}

三:Lambda表达式的基础语法(以代码的形式进行说明)
针对以上6种不同形式的参数作出不同的实现

public class Lambda {
    public static void main(String[] args) {
        //1.lambda表达式的基础语法。关注的方向:参数列表,方法体
        //():用来描述参数列表
        //{}:用来描述方法体
        //->:lambda表达式的运算符,读作goes to

        //无参无返回
        LambdaNoneReturnNoneParameter lambda1=()->{
            System.out.println("helloWord");
        };
        lambda1.test();

        //无返回值,一个参数
        LambdaNoneReturnSingleParameter lambda2=(int a)->{
            int b=10;
            System.out.println(b*a);
        };
        lambda2.test(6);

        //无返回值,多个参数
        LambdaNoneReturnMutipleParameter lambda3=(int a,int b)->{
            System.out.println(a+b);
        };
        lambda3.test(2,3);

        //有返回值,无参数
        LambdaSingleReturnNoneParameter lambda4=()->{
            System.out.println("lambda4");
            return 100;
        };
        System.out.println(lambda4.test());

        //有返回值,单个参数
        LambdaSingleReturnSingleParameter lambda5=(int a)->{
            System.out.println("lambda5");
            return 10+a;
        };
        System.out.println(lambda5.test(5));

        //有返回值,多个参数
        LambdaSingleReturnMutipleParmeter lambda6=(int a,int b)->{
            return a+b;
        };
        System.out.println(lambda6.test(4,5));
    }
}

控制台输出结果:
在这里插入图片描述

四:Lambda表达式的语法精简(省略之前的代码参考上方)
1参数类型:由于在接口中已经定义了参数的类型,所以在lambda表达式中参数的类型可以进行省略。备注:如果有多个参数,类型省略则全部进行省略,不得出现只省略部分的参数类型。
//无返回值,多个参数

LambdaNoneReturnMutipleParameter lambda3=(a,b)->{
    System.out.println(a+b);
};
lambda3.test(2,3);

2.参数小括号:如果参数列表中参数的数量只有一个,此时小括号可以进行省略。
//无返回值,单个参数

LambdaNoneReturnSingleParameter lambda2=a->{
    int b=10;
    System.out.println(b*a);
};
lambda2.test(6);

3.方法体的大括号:如果方法体中只有一条语句,此时的大括号可以进行省略。
//无返回值,无参数

LambdaNoneReturnNoneParameter lambda1=()-> System.out.println("helloWord");
lambda1.test();

4.对省略大括号的补充说明:如果方法体中的唯一条语句是返回语句,省略大括号时则要将return关键字一并进行省略。
//有返回值,多个参数

LambdaSingleReturnMutipleParmeter lambda6=(a, b)-> a+b;
System.out.println(lambda6.test(4,5));

五:方法的引用。
可以快速的将一个lambda表达式的实现指向一个已经实现的方法。
注意事项:
1.参数的数量和类型一定要和接口中定义的方法一致
2.返回值的类型一定要和接口中定义的方法一致

public class Lambda1 {
    public static void main(String[] args) {
        LambdaSingleReturnSingleParameter lambda1=a -> change(2);
        //使用方法引用的效果和上方代码的效果一样
        //方法引用语法:方法的隶属者 :: 方法名
        //引用了change方法的实现
        LambdaSingleReturnSingleParameter lambda2=Lambda1::change;
        System.out.println(lambda1.test(2));
        System.out.println(lambda2.test(2));
    }

    public static int change(int a){
        return a*2;
    }
}

控制台输出结果:
在这里插入图片描述

六:构造方法的方法引用(以下使用用代码进行展示)
设置一个标准类:

public class Person {
    public String name;
    public int age;

    public Person() {
        System.out.println("Person类的无参构造方法执行了");
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("Person类的有参构造方法执行了");
    }
}

方法执行:

public class Lambda2 {
    public static void main(String[] args) {
        PersonCreater creater=()->new Person();
        //无参构造方法的引用:
        PersonCreater creater1=Person::new;
        Person a=creater1.getPerson();
        //有参构造的方法引用:
        PersonCreater2 creater2=Person::new;
        Person b=creater2.getPerson("ccc",18);
    }
}

//无参数构造方法
interface PersonCreater{
    Person getPerson();
}
//有参数构造方法
interface PersonCreater2{
    Person getPerson(String name,int age);
}

控制台输出结果:

七:Lambda表达式案列
案列要求:已知一个ArrayList有若干个Person对象,将这若干个对象按照年龄进行降序排序。

public class ExerciseOne {
    //集合排序,使用ArrayList
    public static void main(String[] args) {
        ArrayList<Person> list=new ArrayList<>();
        list.add(new Person("zhangsan",18));
        list.add(new Person("lisi",17));
        list.add(new Person("wangwu",28));
        list.add(new Person("zhaoliu",58));
        
        //使用Lambda表达式将对象进行排序
        list.sort((o1, o2) -> o1.age-o2.age);
        System.out.println(list);
    }
}

使用Lambda表达式来实现Compaertor接口,并实例化对象。

public class ExerciseTwo {
    public static void main(String[] args) {
        //此处使用Lambda表达式实现Comperator接口
        TreeSet<Person> set=new TreeSet<>((o1,o2)-> {
            if (o1.age>=o2.age){
                return 1;
            }else {
                return -1;
            }
        });
        set.add(new Person("zhangsan",18));
        set.add(new Person("lisi",17));
        set.add(new Person("wangwu",28));
        set.add(new Person("zhaoliu",58));
        System.out.println(set);
    }
}

使用Lambda表达式进行循环遍历

public class ExerciseThree {
    public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<>();
        Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);
        //将集合中的没一个元素带入到方法accpet中
        list.forEach(System.out::println);
        //输出集合中的偶数
        list.forEach(integer -> {
            if (integer % 2 == 0){
                System.out.println(integer);
            }
        });
    }
}

使用lambda表达式删除年龄大于20的人物

public class ExerciseFour {
    public static void main(String[] args) {
        ArrayList<Person> list=new ArrayList<>();
        list.add(new Person("zhangsan",18));
        list.add(new Person("lisi",17));
        list.add(new Person("wangwu",28));
        list.add(new Person("zhaoliu",58));

       /* ListIterator<Person> it=list.listIterator();
        while (it.hasNext()){
            Person ele=it.next();
            if (ele.age > 20){
                it.remove();
            }
        }
        System.out.println(list);*/

        //使用lambda表达式删除年龄大于20的人物
        list.removeIf(els->els.age>20);
        System.out.println(list);
    }
}

使用Lambda表达式开启线程的实例化

public class ExerciseFive {
    public static void main(String[] args) {
        Thread t=new Thread(()-> {
            for (int i = 0; i <10; i++) {
                System.out.println(i);
            }
        });
        t.start();
        System.out.println(t.getName());
    }
}

八:常用的函数式接口
//Predicate : 参数T 返回值boolean
//Consumer : 参数T 无返回值
//Funcation<T,R> : 参数T 返回值R
//Supplier : 参数无 返回值T
//UnaryOperator : 参数T 返回值T
//BinaryOperator : 参数T,T 返回值T
//BiFunction<T,U,R> : 参数T,U 返回值R
//BiPredicate<T,U> : 参数T,U 返回值boolean
//BiConsumer<T,U> : 参数T,U 返回值无
//常用的函数式接口:Predicate,Consumer,Funcation,Supplier

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值