Lamada
函数式接口
概念:有且仅有一个抽象方法的接口
由于只有一个抽象方法 Lamada 才能顺利推导
@FunctionalInterface 放在该接口上强制检查接口是否只有一个抽象方法 否则保存
当然符合有且仅有一个抽象方法也不用加该注解
Lamada 示例
接口中 public abstract 可以省略
@FunctionalInterface public interface MyFunctionalInterface { public abstract void myMethod(String s); }
个人理解为调用接口时重写抽象方法
有返回值示例 - 定义接口
@FunctionalInterface public interface Sumable { int sum(int a, int b); }
定义处理方法
private static void showSum(int x, int y, Sumable sumCalculator) { System.out.println(sumCalculator.sum(x, y)); }
在 Main 方法中调用
showSum(10, 20, (m,n)->m + n);
不写处理方法直接写匿名内部类形式比较容易理解
Sumable sumable = new Sumable() { @Override public int sum(int a, int b) { return a + b; } }; System.out.println(sumable.sum(20, 30));
后一种改成 Lamada 形式
Sumable sumable = (a, b) -> a + b;System.out.println(sumable.sum(20, 30));
函数式编程
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); } }
原因
调用方法时候优先拼接了字符串
无论条件是否符合都拼接了
解决
改 Lamada 形式
定义接口
@FunctionalInterface public interface MessageBuilder { String buildMessage(); }
改造方法
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 ); } }
类似:SLF4J 会在满足日志级别时进行字符串拼接
LOGGER.debug(" 变量{} 的取值为{}。", "os", "macOS")
Lamada 作参数与返回值
目录
Lamada
- 函数式接口
- Lamada 示例
- 函数式编程
- Lambda 延迟加载
- 性能浪费实例
- 原因
- 解决
- Lamada 作参数与返回值
目录
Lamada
- 函数式接口
- Lamada 示例
- 函数式编程
- Lambda 延迟加载
- 性能浪费实例
- 原因
- 解决
- Lamada 作参数与返回值