Lambda_作为参数和返回值

如果抛开实现原理不说,Java中的Lambda表达式可以被当作是匿名内部类的替代品。如果方法的参数是一个函数式接口类型,那么就可以使用Lambda表达式进行替代。使用Lambda表达式作为方法参数,其实就是使用函数式接口作为方法参数。

例如 java.lang.Runnable 接口就是一个函数式接口,假设有一个startThread 方法使用该接口作为参数,那么就可以使用Lambda进行传参。这种情况其实和Thread 类的构造方法参数为Runnable 没有本质区别。

public class RunableImpl {

    //Runnable是一个函数式接口
    public static void startThread(Runnable run){
        //Thread实现Runnable接口,启动线程
        new Thread(run).start();
    }

    public static void main(String[] args) {
        //给Runnble接口实现一个方法
        startThread(()->System.out.println("线程开始执行任务!"));
    }
}

类似地,如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式。当需要通过一个方法来获取一个java.util.Comparator 接口类型的对象作为排序器时,就可以调该方法获取。

public class ComparatorImpl {
    public static Comparator<String> newComparator(){
        /*return new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //按照字符串降序排序
                return o2.length()-o2.length();
            }
        };*/
        //方法的返回值类型是一个函数式接口,所以我们可以返回一个Lambda表达式
        /*return (String o1,String o2)->{
            return o2.length()-o2.length();
        };*/
        //继续优化Lambda表达式
        return (o1,o2)->o2.length()-o1.length();
    }

    public static void main(String[] args) {
        String[] arr={"a","bb","ccc","dddd"};
        System.out.println("排序之前:"+Arrays.toString(arr));
        Arrays.sort(arr,newComparator());
        System.out.println("排序之后:"+Arrays.toString(arr));
    }
}

其中直接return一个Lambda表达式即可。

学习中,博客都是自己学习用的笔记,持续更新改正。。。
原文地址:https://www.cnblogs.com/Tunan-Ki/p/11837989.html