java基础之函数式接口
一、函数式接口在Java中是指:有且仅有一个抽象方法的接口,所以函数式接口就是可以适用于Lambda使用的接口
二、自定义函数式接口
格式:
@FunctionalInterface //该注解可省,一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错
public interface MyFunctionalInterface {
void myMethod();
}
例子:
public class FunctionalInterfaceTest {
public static void main(String[] args) {
show(()->{
System.out.println("使用lambda表达式执行");
});
}
public static void show(MyFunctionalInterface inner){
inner.method();
}
}
三、使用Lambda作为参数和返回值:如果方法的参数是一个函数式接口类型,那么就可以使用Lambda表达式进行替代。使用Lambda表达式作为方法参数,其实就是使用 函数式接口作为方法参数。
例子:Lambda作为参数
public class FunctionalInterfaceTest {
public static void main(String[] args) {
getThread1(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"....执行");
}
});
getThread2(()->{
System.out.println(Thread.currentThread().getName()+"....执行");
});
}
public static void getThread1(Runnable task){
new Thread(task).start();
}
public static void getThread2(Runnable task){
new Thread(task).start();
}
}
例子:作为返回值
public class ComparatorTest {
//定义一个方法,方法的返回值类型使用函数式接口Comparator
public static Comparator<Integer> getComparator(){
/*
return new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//降序
return o2 - o1;
}
};
*/
//使用lambda简写
return((o1, o2)-> o2 - o1);
};
public static void main(String[] args) {
Integer[] arr = {1,3,9,2,7,8};
System.out.println("....排序前...."+Arrays.toString(arr));
Arrays.sort(arr,getComparator());
System.out.println("....排序后...."+Arrays.toString(arr));
}
}
四、简单明了例子
public class MyInterfacesTest {
public static void main(String[] args) {
/* getMethod(new MyInterfaces<String>() {
@Override
public int method(String s) {
return s.length();
}
});
*/
//简写方式
getMethod(s -> s.length()); //处理
}
public static void getMethod(MyInterfaces<String> myInterfaces){
int len = myInterfaces.method("HelloWorld"); //传参
System.out.println("该字符串的长度为:"+len);
}
}