函数式编程
Lambda的延迟执行
-性能浪费的日志案例
日志可以帮助我们快速的定位问题,记录程序运行过程中的情况,以便的监控和优化。 一种典型的场景就是对参数进行有条件使用,例如对日志消息进行拼接后,在满足条件的情况下进行打印输出:
public class Demo01Logger {
private static void log(int level, String msg) {
if (level == 1) {
System.out.println(msg);
} }
public static void main(String[] args) {
String msgA = "Hello";
String msgB = "World";
String msgC = "Java";
log(1, msgA + msgB + msgC);
}
}
体验Lambda的更优写法
使用Lambda必然需要一个函数式接口:
@FunctionalInterface
public interface MessageBuilder {
String buildMessage();
}
然后对 log 方法进行改造:
public class Demo02LoggerLambda {
private static void log(int level, MessageBuilder builder){
if (level == 1) {
System.out.println(builder.buildMessage());
}
}
public static void main(String[] args){
String msgA = "Hello";
String msgB = "World";
String msgC = "Java";
log(1, () ‐> msgA + msgB + msgC );
}
}
证明Lambda的延迟
public class Demo03LoggerDelay {
private static void log(int level, MessageBuilder builder){
if (level == 1) {
System.out.println(builder.buildMessage());
} }
public static void main(String[] args) {
String msgA = "Hello";
String msgB = "World";
String msgC = "Java";
log(2, () ‐> { System.out.println("Lambda执行!"); return msgA + msgB + msgC;}); }
}
使用Lambda作为参数和返回值
Java中的Lambda表达式可以被当作是匿名内部类的替代品。如果方法的参数是一个函数式接口类型,那么就可以使用Lambda表达式进行替代。使用Lambda表达式作为方法参数,其实就是使用函数式 接口作为方法参数。
Lambda作为参数
使用Lambda作为参数
public class Demo_Runnable {
private static void startThread(Runnable run) {
new Thread(run).start();
}
public static void main(String[] args) {
startThread(() ‐> System.out.println("线程任务执行!"));
} }
Lambda作为返回值类型
package com.itcast.hssjk2;
import java.util.Arrays;
import java.util.Comparator;
//函数式接口的使用:函数式接口作为返回值
public class TestComparator {
///定义一个方法,返回值类型使用函数式接口Comparator<T>
public static Comparator<String> show(){
//方法一:使用匿名内部类
// return new Comparator<String>() {
// @Override
// public int compare(String o1, String o2) {
// return o1.length()-o2.length();
// }
// };
//因为返回值是一个函数式接口,所以可以使用lambda表达式
return (o1, o2) -> o1.length()-o2.length();
}
public static void main(String[] args) {
String[]arr={"aaa","b","cc","ddddddd"};
System.out.println(Arrays.toString(arr));
Arrays.sort(arr,show());
System.out.println(Arrays.toString(arr));
}
}
|
|