函数式接口:
定义:在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]
}
}