JDK8 新特性-Lambda 表达式

82 阅读2分钟

1.Lambda允许把函数式接口作为一个方法的参数。

比如:

Runnable runnable=new Runnable(){
   
    public void run() {
  
    System.out.println("aaa");
 
    }
};
new Thread(runnable).start();

runnable 就是一个函数式接口.

2.允许把函数式接口作为方法的返回值类型

比如:

// 定义一个方法,方法的返回值类型使用函数式接口Comparator
    public static Comparator<String> getComparator() {
        // 方法的返回值是一个接口,那么我们可以返回这个接口的匿名内部类
        /*return new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // 按照字符串的降序排序
                return o2.length() - o1.length();
            }
        };*/
        // 方法的返回值类型是一个函数式接口,所以我们可以返回一个Lambda表达式
       /* return (String o1, String o2) -> {
            return o2.length() - o1.length();
        };*/
        // 优化Lambda表达式
        return (o1, o2) -> o2.length() - o1.length();
    }
    
     public static void main(String[] args) {
         // 创建一个字符串数组
        String[] arr = {"aaaaa", "ooooooo", "sssssssss", "llll"};
        // 排序前数组
        // System.out.println(Arrays.toString(arr));
        // 调用Arrays中的sort方法,对字符串数组进行排序
        Arrays.sort(arr, getComparator());
        // 排序后的数组
        System.out.println(Arrays.toString(arr));
    }

这两种方式都可以自行进行定义。

3.什么是函数式接口

函数式接口 有@FunctionalInterface注解。 任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。

4.常用的函数式接口

Supplier 生产型接口,指定接口泛型是什么类型,那么接口中的get 方法就会产生什么类型数据

Consumer 接口是一个消费类型接口,泛型执行什么类型,就可以使用accpet 方法消费什么类型数据

Predicate 对某种数据类型的数据进行判断,结果返回一个boolean ,抽象方法为test()。

Function 接口用来根据一个类型的数据得到另一个类型的数据, 使用抽象方法 R apply(T t)根据类型T 的参数获取类型R的结果。使用场景 例如:将String 类型转换为Intger 类型

5.应用

案列一

image.png

案列二

image.png

image.png

image.png