Java 基础复习 Day 24
常见函数式接口 (1)
-
函数式接口:
-
定义:在java中,函数式接口指的是在接口中有且只有一个抽象方法
-
应用:在java中的体现就是lambda表达式(Lambda表达式就是匿名内部类的“语法糖”,但更简单的形式)
-
格式:
修饰符 interface 接口名{
[public] [abstract] 修饰符 方法名(参数列表);
//其他非抽象方法内容
}
-
@FunctionalInterface注解,来确保和检查这个接口是函数式接口
@FunctionalInterface public interface DemoFuncInterface { void method1(); }
-
应用场景:函数式接口作为方法的返回值或参数
-
和一般接口比较多了一个lambda表达式来实现接口的抽象方法
//上边函数式接口作为方法参数的应用 public static void main(String[] args) { show(() -> { System.out.println("函数式接口的lambda实现方式"); }); } public static void show(DemoFuncInterface funcInterface){ funcInterface.method1(); }
-
-
函数式编程
2.1 Lambda的延迟执行(有些场景的代码执行后,结果不一定被使用,从而造成了一定的性能浪费,而lambda表达式是延迟执行的,正好可以作为解决方案而使性能进行提升)
性能浪费的日志案例
/* *日志案例: * * 发现以下代码存在性能浪费问题: * 发现 showLog方法前 是把第二个参数拼接后再去调用showLog方法, * 如果等级是1, 那么showLog前的message拼接就是无用功 * */ public class demo01Logger { //定义一个根据日志的级别去显示日志信息的方法 public static void showLog(int level, String mesg){ //对日志等级进行判断 if (level == 1) { System.out.println(mesg); } } public static void main(String[] args) { String msg1 = "Hello"; String msg2 = "World"; String msg3 = "Java"; //调用日志显示方法,传递日志显示级别和信息 showLog(1,msg1+msg2+msg3); } } //使用Lambda编程优化日志案例: //定义一个函数式接口,定义一个拼接字符串的抽象方法头 @FunctionalInterface public abstract interface MessageBuilder { String buildMessage(); } /* * 使用Lambda编程来简化和优化日志案例 * Lambda特点:延迟加载 * Lambda使用前提:存在函数式接口 * */ public class Demo02Lambda { public static void main(String[] args) { String msg1 = "Hello"; String msg2 = "World"; String msg3 = "Java"; //调用日志显示方法,传递日志显示级别和信息 showLog(1,() -> msg1+msg2+msg3); /* * 使用Lambda表达式时, 只有level是1时,才会调用接口buildMessage方法, * 此时才会进行字符串的拼接, * 如果条件不满足,level不是1时,buildMessage就不会执行,那么就不会执行字符串的拼接 * 那么就不会存在性能的拼接 * */ } //定义一个根据日志的级别去显示日志信息的方法,参数有所变化,int的level和接口类型的创建好的message public static void showLog(int level, MessageBuilder mesg){ //对日志等级进行判断 if (level == 1) { System.out.println(mesg.buildMessage()); } } }
2.2 函数式接口作为返回值,JDK内置的函数式接口:comparator
import java.util.Arrays;
import java.util.Comparator;
public class DemoComparator {
public static Comparator<String> compareStrings1(){
//方法的返回值是一个接口
return new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.length() - o1.length();//降序排列
}
};
}
public static Comparator<String> compareStrings2(){
//方法的返回值是一个接口
return (o1, o2) -> o2.length() - o1.length();
}
public static void main(String[] args) {
String[] strings = {"aaa","b","cccc","dd","a"};
System.out.println(Arrays.toString(strings));//[aaa, b, cccc, dd, a]
Arrays.sort(strings,compareStrings2());
System.out.println(Arrays.toString(strings));//[cccc, aaa, dd, b, a]
}
}