JavaSE之Lambda表达式(个人笔记)

本文介绍了Java 8的Lambda表达式,它简化了匿名内部类的使用,使得代码更加简洁。Lambda表达式适用于只有一个抽象方法的函数式接口。文中详细讲解了Lambda的语法,包括无参无返回值和多个参数有返回值的用法,并通过实例展示了Lambda在集合操作如排序和过滤中的应用。此外,还提到了@FunctionalInterface注解及其在简化代码中的作用。
摘要由CSDN通过智能技术生成

Lambda简介

        Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。

        JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。

一、对接口的要求

        虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法

二、@FunctionalInterface

        修饰函数式接口的,要求接口中的抽象方法只有一个。 这个注解往往会和 lambda 表达式一起出现。

三、Lambda 基础语法

        语法形式为 () -> {},其中 () 用来描述参数列表,-> 为 lambda运算符 ,{} 用来描述方法体。

/**无参无返回值*/
@FunctionalInterface
public interface NoReturnNoParam {
    void method();
}
/**多个参数有返回值*/
@FunctionalInterface
public interface ReturnMultiParam {
    int method(int a, int b);
}
public class Test {
    public static void main(String[] args) {

        //无参无返回
        NoReturnNoParam noReturnNoParam = () -> {
            System.out.println("NoReturnNoParam");
        };
        noReturnNoParam.method();

        //多个参数有返回值
        ReturnMultiParam returnMultiParam = (int a, int b) -> {
            System.out.println("ReturnMultiParam param:" + "{" + a + "," + b +"}");
            return 1;
        };

        int res3 = returnMultiParam.method(6, 8);
        System.out.println("return:" + res3);
    }
}

四、Lambda 语法简化

import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

public class Test {

    public static void main(String[] args) {

        List<Integer> list = new ArrayList<>();

        // 给list添加元素
        Collections.addAll(list, 7, 324, 89, 21, 54, 8, 44);

        System.out.println(list);// [7, 324, 89, 21, 54, 8, 44]

        // 实现Comparator接口进行升序排序
        list.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        });
        System.out.println(list);// [7, 8, 21, 44, 54, 89, 324]

        /**
         * 系统完全可以推断出sort方法的形参是Comparator接口比较器,
         * 系统也完全可以推断出Comparator接口有一个compare抽象方法需要重写,
         * 把系统能够推断出来的省略,在方法参数与方法体中间使用一个箭头连接,这就是Lambda表达式。
         * Lambda表达式可以看作一个匿名方法,没有方法名,只有参数列表与方法体。
         */
        list.sort((Integer o1, Integer o2) -> {
            return o2.compareTo(o1);
        });
        System.out.println(list);// [324, 89, 54, 44, 21, 8, 7]
		
		ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(new Student("lisi",20,90));
        arrayList.add(new Student("wangwu",40,80));
        arrayList.add(new Student("zhaoliu",40,40));
        // 删除
        arrayList.removeIf(ele -> ele.getName().equals("lisi"));
        System.out.println(arrayList);// [Student{name='wangwu', age=40, score=80}, Student{name='zhaoliu', age=40, score=40}]

        /**
         * Lambda表达式的语法:
         *      (参数列表)-> {方法体}
         * 1)参数列表中参数类型可以省略
         * 2)如果参数列表中只有一个参数,小括号也可以省略
         * 3)如果Lambda体中只有一条语句,大括号也可以省略,这一条语句如果是返回语句,return也可以省略
         * Lambda表达式作用:
         *       可以使代码更简洁
         */
        list.sort((o1, o2) ->  o1.compareTo(o2));
        System.out.println(list);// [7, 8, 21, 44, 54, 89, 324]


        list.forEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                System.out.println(integer);
            }
        });
        // 简写后的Lambda表达式
        list.forEach(integer -> System.out.println(integer));
         // Lambda表达式引用方法(方法引用):方法归属者::方法名 静态方法的归属者为类名,普通方法归属者为对象
        list.forEach(System.out ::println);


        Map<String,Integer> map = new HashMap<>();
        map.put("lisi",5000);
        map.put("wangwu",9000);
        map.put("zhaoliu",2000);
        map.put("chenqi",7000);
        map.forEach(new BiConsumer<String, Integer>() {
            @Override
            public void accept(String s, Integer integer) {
                System.out.println(s + ":" + integer);
            }
        });
        // 简写后的Lambda表达式
        map.forEach((k,v) -> System.out.println(k + ":" + v));

        Set<String> keySet = map.keySet();
        // 转成流对象,过滤要求长度大于4,升序排序,进行遍历
        keySet.stream().filter(x -> x.length() > 4).sorted(String::compareTo).forEach(System.out::println);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值