【SE-03】Lambda表达式、函数式接口与方法引用
发布日期:2021-05-07 08:58:12 浏览次数:24 分类:精选文章

本文共 2916 字,大约阅读时间需要 9 分钟。

Lambda表达式与函数式接口

Lambda表达式

基本介绍

Lambda表达式是一种匿名函数,在Java中可以直接使用优化的方式进行操作。通过Lambda表达式,可以将功能性代码简化为更简洁的代码形式。

示例代码

以下是Lambda表达式的典型使用示例:

// 接收一个字符串并进行处理 Consumer
consumer = (str) -> { System.out.println("处理结果:" + str); }; // 可以直接调用 consumer.accept("北京");

Lambda表达式可以直接传递给接收者(如Consumer、Function、Supplier等接口),简化了传统的匿名内部类方式。

语法标准

Lambda表达式的语法格式如下:

Lambda表达式 -> { 代码逻辑 }

Lambda表达式 -> 表达式

(对于返回值为void的情况,可以省略返回语句)

类型推断

在函数式编程中,类型推断可以帮助开发者更方便地书写代码。例如:

// 假设接口定义为:public interface MyInterface
{ T method(T t); }MyInterface
myInterface = () -> { return "Hello, World!";};

类型推断自动确定了方法的参数类型和返回类型,提升了代码的可读性和可维护性。

函数式接口

基本介绍

函数式接口是Java中的一种特殊接口,其每个方法都可以看作是一个函数。通过函数式接口,可以将逻辑抽象为功能,方便进行组合和传递。

代码示例

以下是一个简单的函数式接口的定义和使用示例:

// 定义一个函数式接口public interface Function
{ R apply(T t);}

使用Lambda表达式实现:

// 定义一个函数式接口实例Function
function = (str) -> { return str.length();};// 调用函数System.out.println(function.apply("abc")); // 输出:3

四大函数式接口

在Java中,最常用的四个函数式接口包括:

  • Consumer
    :用于消费操作,如打印日志。
    Consumer
    consumer = System.out::println;consumer.accept("测试");
  • Function<T, R>:用于函数操作,如数据转换。
    Function
    function = String::length;System.out.println(function.apply("测试")); // 输出:4
  • Supplier
    :用于供应操作,如创建对象。
    Supplier
    supplier = Employee::new;Employee employee = supplier.get();
  • BiPredicate<T1, T2>:用于双参数的逻辑判断。
    BiPredicate
    predicate = String::equals;predicate.test("abc", "abd"); // 返回:false
  • 其他函数式接口

    除了上述四个,还有其他如ComparatorBiFunction等,用于更复杂的功能组合。

    方法引用

    方法引用是一种更高效的方式来传递函数,而不是传统的Lambda表达式。方法引用的使用场景包括:

    使用情景

  • 对象 :: 非静态方法
    // 消费操作Consumer
    consumer = System.out::println;consumer.accept("测试");
  • 类 :: 静态方法
    // 比较操作Comparator
    comparator = Integer::compare;System.out.println(comparator.compare(1, 2)); // 输出:1
  • 类 :: 非静态方法
    // 字符串比较Comparator
    stringComparator = String::compareTo;System.out.println(stringComparator.compare("abc", "abd")); // 输出:1
  • 具体实现

  • 对象 :: 非静态方法
    // PrintStream中的void println(T t)Consumer
    consumer = System.out::println;consumer.accept("北京");
  • 类 :: 静态方法
    // Integer中的int compare(T t1, T t2)Comparator
    comparator = Integer::compare;System.out.println(comparator.compare(3, 3)); // 输出:0
  • 类 :: 非静态方法
    // String中的int compareTo(String s)Comparator
    stringComparator = String::compareTo;System.out.println(stringComparator.compare("abc", "abd")); // 输出:1
  • 构造器引用

    构造器引用是一种特殊的方法引用,用于创建对象。例如:

    // 无参构造Supplier
    supplier = Employee::new;Employee employee = supplier.get();// 有参构造BiFunction
    function = (id, name) -> new Employee(id, name);Employee employee = function.apply(10, "zs");

    数组引用

    数组可以看作特殊的构造器:

    // 创建一个固定长度的数组Function
    function = (length) -> new String[length];String[] array = function.apply(5);// 使用String[]::newString[] array = String[]::new;

    总结

    通过Lambda表达式和函数式接口,可以简化代码实现,提高代码的可读性和可维护性。方法引用和构造器引用则为代码提供了更高效的传递方式。这些技术在函数式编程中发挥着重要作用。

    上一篇:vue(10):路由传参、路由嵌套、路由命名视图
    下一篇:vue(14):使用ref获取DOM元素和组件引用

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月04日 21时25分37秒