java 8 中 lambda 和函数式接口的使用
简介
第 42 项:与匿名类相比,更喜欢 lambda
历史: 在 java 8 之前,具有单个抽象方法的接口被用作函数类型,通常使用匿名类实现。
匿名类的问题: 过多的冗长使得函数式编程变得困难。
java 8 中的 lambda:
比匿名类更简洁。
示例:
使用 lambda 进行字符串比较:
list<string> words = arrays.aslist("apple", "banana", "cherry"); collections.sort(words, (s1, s2) -> integer.compare(s1.length(), s2.length()));
类型推断:
编译器从上下文推断类型。
如果推理失败,您可能需要手动指定类型。
示例:列表而不是列表。
比较器构造方法的使用:
示例:使用 comparator.comparingint:
collections.sort(words, comparator.comparingint(string::length));
枚举中的 lambda:
使枚举常量的特定行为变得更容易实现。
没有 lambda 的操作:
示例:使用 lambda 进行枚举操作:
public enum Operation { PLUS((x, y) -> x + y), MINUS((x, y) -> x - y); private final DoubleBinaryOperator operation; Operation(DoubleBinaryOperator operation) { this.operation = operation; } public double apply(double x, double y) { return operation.applyAsDouble(x, y); } }
lambda 的局限性:
匿名类仍然有一席之地:
序列化注意事项:
结论
lambda 更适合小型函数对象,并使 java 中的函数式编程变得更容易。
仅在必要时使用匿名类,例如非函数式接口的类型。
lambda 为以前在 java 中不切实际的函数式编程技术打开了大门。