首页 > 文章列表 > Item 更喜欢 lambda 而非匿名类

Item 更喜欢 lambda 而非匿名类

381 2024-08-06

java 8 中 lambda 和函数式接口的使用

简介

  • java 8 引入了函数式接口、lambda 和方法引用,使创建函数对象变得更加容易。
  • 添加了 streams api 以协助处理数据元素序列。

第 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 的操作:

image description

示例:使用 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 没有名称或文档。
  • 它们应该简短而清晰。
  • 无法访问枚举实例的成员。
  • 不能用于创建具有多个抽象方法的抽象类或接口的实例。
  • 不能直接互相引用(用这个)。

匿名类仍然有一席之地:

  • 对于具有多个方法的抽象类和接口的实例很有用。
  • 体内自己的参照。
  • 创建函数对象的可序列化实例的最佳选择。

序列化注意事项:

  • 避免序列化 lambda 或匿名类的实例。
  • 对可序列化函数对象使用私有静态嵌套类。

结论
lambda 更适合小型函数对象,并使 java 中的函数式编程变得更容易。
仅在必要时使用匿名类,例如非函数式接口的类型。
lambda 为以前在 java 中不切实际的函数式编程技术打开了大门。

来源:https://dev.to/giselecoder/item-42-prefira-os-lambdas-as-classes-anonimas-27j3

本类最新

查看更多