Java Lambda表达式,有参数的使用,有参数有返回值的使用,Lambda表达式的省略格式,使用前提。

1、Lambda表达式

/*
Lambda表达式的标准格式:
由三部分组成
a、一些参数
b、一个箭头
c、一段代码
格式:
(参数列表) -> {一些重写方法的代码};

    解释说明格式:
        ();接口中抽象方法的参数列表,没有参数就空着,有参数就写出参数,多个参数使用逗号分割
        -> :传递的意思,把参数传递给方法体{}
        {}:重写接口的抽象方法的方法体

*/
示例:
Cook接口:

public interface Cook {
    
    
    void makeFood();
}

实现类:

public class Demo03InvokeCook {
    
    
    public static void main(String[] args) {
    
    
        //使用匿名内部类实现
        invokeCook(new Cook() {
    
    
            @Override
            public void makeFood() {
    
    
                System.out.println("吃饭了");
            }
        });

        //使用Lambda表达式
        invokeCook(()->{
    
    
            System.out.println("吃饭去了");
        });
    }

    public static void invokeCook(Cook cook){
    
    
        cook.makeFood();
    }
}

2、Lambda表达式有参数

Person类:

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


    public Person() {
    
    
    }

    public Person(String name, int age) {
    
    
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
    
    
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }
}

实现类:

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

/*
    Lambda表达式有参数返回值的练习
    需求:
        使用数组存储多个Person对象
        对数组中的Person对象使用Arrays的sort方法通过年龄进行升序排序
 */
public class Demo04Arrays {
    
    
    public static void main(String[] args) {
    
    
        //使用数组存储多个Person对象
        Person[] array = {
    
    
                new Person("王雷",23),
                new Person("陈雷",21),
                new Person("地雷",26),
                new Person("樊雷",20),
        };

        //对数组中的Person对象使用Arrays的sort方法通过年龄进行升序排序(前边-后边)排序
//        Arrays.sort(array, new Comparator<Person>() {
    
    
//            @Override
//            public int compare(Person o1, Person o2) {
    
    
//                return o1.getAge() - o2.getAge();
//            }
//        });

        //使用Lambda表达式简化匿名内部类
        Arrays.sort(array,(Person o1,Person o2)->{
    
    
            return o1.getAge() - o2.getAge();
        });

        //遍历数组
        for (Person p : array) {
    
    
            System.out.println(p);
//            Person{name='樊雷', age=20}
//            Person{name='陈雷', age=21}
//            Person{name='王雷', age=23}
//            Person{name='地雷', age=26}
        }

    }
}

3、Lambda表达式有参数有返回值

计算两个整数的和
接口:

public interface Calculator {
    
    
    public abstract int calc(int a, int b);
}

实现类:

public class Demo01Calculator {
    
    
    public static void main(String[] args) {
    
    
        //调用invokeCalc方法 匿名内部类
        invokeCalc(120, 145, new Calculator() {
    
    
            @Override
            public int calc(int a, int b) {
    
    
                return a + b;
            }
        });

        //使用Lambda表达式
        invokeCalc(120,125, (int a, int b)->{
    
    
            return a + b;
        });

    }
    //定义一个方法 参数传递两个int类型的整数,Calculator接口
    //方法内部调用Calculator中的方法calc计算整数的和
    public static void invokeCalc(int a, int b, Calculator calculator) {
    
    
        int sum = calculator.calc(a, b);
        System.out.println(sum);
    }
}

4、Lambda表达式省略格式,使用前提

Lambda表达式是可推导,可省略的
凡是根据上下文推导出来的内容,都可以省略书写
可以省略的内容:
1、(参数列表):括号中的参数列表的数据类型,可以省略不写
2、(参数列表):括号中的参数只有一个,那么类型和()都可以省略
3、(参数列表):如果{ }中的代码只有一行,无论是否有返回值,都可以省略({ }, return , 分号 )
注意:要省略{ }, return , 分号,必须一起省略

使用前提:
1、使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。
2、使用Lambda必须具有上下文推断,也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
备注:有且仅有一个抽象方法的接口,称为“函数式接口”。

猜你喜欢

转载自blog.csdn.net/Gaoju12138/article/details/109546832
今日推荐