函数式接口作为方法的参数案例与函数式接口作为方法的返回值类型案例
函数式接口作为方法的参数案例
使用Lambda作为参数和返回值
如果抛开实现原理不说,Java中的Lambda表达式可以被当作是匿名内部类的替代品。如果方法的参数是一个函数式接口类型,那么就可以使用Lambda表达式进行替代。使用Lambda表达式作为方法参数,其实就是使用函数式接口作为方法参数。
package day01.demo01.Demo02; /* 例如java.lang.Runnable接口就是一个函数式接口, 假设有一个startThread方法使用该接口作为参数,那么就可以使用Lambda进行传参。 这种情况其实和Thread类的构造方法参数为Runnable没有本质区别。 */ public class Demo02Lambda { //定义一个方法startThread,方法的参数使用函数式接口Runnable public static void startThread(Runnable run){ //开启多线程 new Thread(run).start(); } public static void main(String[] args) { //调用startThread方法,方法的参数是一个接口,那么我们可以传递这个接口的匿名内部类 startThread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"->"+"线程启动了"); } }); startThread(()->{ System.out.println(Thread.currentThread().getName()+"-->"+"线程启动了"); }); startThread(()-> System.out.println(Thread.currentThread().getName()+"-->"+"线程启动了")); } }
函数式接口作为方法的返回值类型案例
类似地,如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式。当需要通过一个方法来获取一个java.up1 1.Comparator 接口类型的对象作为排序器时,就可以调该方法获取。
package day01.demo01.Demo02; import java.util.Arrays; import java.util.Comparator; /* 如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式。 当需要通过一个方法来获取一个java.util.comparator接口类型的对象作为排序器时,就可以调该方法获取。 */ public class Demo02Comparator { //定义一个方法,方法的返回值类型使用函数式接口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(); }; */ return ((o1, o2) -> o2.length()-o1.length()); } public static void main(String[] args) { //创建一个字符数组 String[] s ={"aaaa","bbb","cccc","dddd"}; //输出排序前的数组 System.out.println(Arrays.toString(s)); ///调用Arrays中的sort方法,对字符串数组进行排序 Arrays.sort(s,getComparator()); //输出排序后的数组 System.out.println(Arrays.toString(s)); } }