自学内容网 自学内容网

java 方法引用与构造器引用

Java 方法引用和构造器引用是 Java 8 引入的重要特性,它们进一步简化了 Lambda 表达式的书写,使得代码更加简洁和易读。下面详细介绍方法引用和构造器引用的概念、用法及示例。

方法引用

方法引用是一种简化 Lambda 表达式的语法糖,它允许通过类名或对象引用直接引用已有方法。方法引用可以替代某些 Lambda 表达式,使得代码更简洁。

语法

方法引用的语法格式如下:

  • 引用类的方法ClassName::methodName
  • 引用对象的方法objectReference::methodName
  • 引用实例方法instanceReference::methodName
  • 引用构造器ClassName::new

示例

示例 1:引用类的方法

假设有一个 MathUtil 类,其中包含一个静态方法 square

public class MathUtil {
    public static int square(int x) {
        return x * x;
    }
}

使用 Lambda 表达式和方法引用:

import java.util.Arrays;
import java.util.List;

public class MethodReferenceExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 使用 Lambda 表达式
        numbers.stream()
                .map(x -> MathUtil.square(x))
                .forEach(System.out::println);

        // 使用方法引用
        numbers.stream()
                .map(MathUtil::square)
                .forEach(System.out::println);
    }
}
示例 2:引用对象的方法

假设有一个 Calculator 类,其中包含一个实例方法 add

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

使用 Lambda 表达式和方法引用:

import java.util.Arrays;
import java.util.List;

public class MethodReferenceExample {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 使用 Lambda 表达式
        numbers.stream()
                .map(x -> calculator.add(x, 10))
                .forEach(System.out::println);

        // 使用方法引用
        numbers.stream()
                .map(x -> calculator::add)
                .forEach(System.out::println);
    }
}
示例 3:引用实例方法

假设有一个 StringUtil 类,其中包含一个实例方法 reverse

public class StringUtil {
    public String reverse(String str) {
        return new StringBuilder(str).reverse().toString();
    }
}

使用 Lambda 表达式和方法引用:

import java.util.Arrays;
import java.util.List;

public class MethodReferenceExample {
    public static void main(String[] args) {
        List<String> strings = Arrays.asList("hello", "world", "java");

        // 使用 Lambda 表达式
        strings.stream()
                .map(str -> new StringUtil().reverse(str))
                .forEach(System.out::println);

        // 使用方法引用
        strings.stream()
                .map(StringUtil::reverse)
                .forEach(System.out::println);
    }
}

构造器引用

构造器引用是另一种方法引用的形式,用于创建对象的构造器。构造器引用的语法格式如下:

  • 引用构造器ClassName::new

示例

示例 1:引用构造器

假设有一个 Person 类,其中包含一个构造器:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

使用 Lambda 表达式和构造器引用:

import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;

public class ConstructorReferenceExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        List<Integer> ages = Arrays.asList(25, 30, 35);

        // 使用 Lambda 表达式
        List<Person> people = new ArrayList<>();
        for (int i = 0; i < names.size(); i++) {
            people.add(new Person(names.get(i), ages.get(i)));
        }

        // 使用构造器引用
        List<Person> people2 = IntStream.range(0, names.size())
                .mapToObj(i -> new Person(names.get(i), ages.get(i)))
                .collect(Collectors.toList());

        // 使用 Supplier
        Supplier<Person> supplier = Person::new;
        Person person = supplier.get();
    }
}

方法引用的常见应用场景

1. 遍历集合
import java.util.Arrays;
import java.util.List;

public class MethodReferenceExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 使用方法引用
        numbers.forEach(System.out::println);
    }
}
2. 字符串处理
import java.util.Arrays;
import java.util.List;

public class MethodReferenceExample {
    public static void main(String[] args) {
        List<String> strings = Arrays.asList("hello", "world", "java");

        // 使用方法引用
        strings.stream()
                .map(String::toUpperCase)
                .forEach(System.out::println);
    }
}
3. 数学运算
import java.util.Arrays;
import java.util.List;

public class MethodReferenceExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 使用方法引用
        int sum = numbers.stream()
                .reduce(0, Integer::sum);

        System.out.println(sum); // 输出 15
    }
}

总结

Java 方法引用和构造器引用是 Java 8 引入的重要特性,它们进一步简化了 Lambda 表达式的书写,使得代码更加简洁和易读。

  • 方法引用:用于引用已有方法,可以替代某些 Lambda 表达式,使得代码更简洁。

    • 引用类的方法ClassName::methodName
    • 引用对象的方法objectReference::methodName
    • 引用实例方法instanceReference::methodName
  • 构造器引用:用于引用构造器,简化对象创建。

    • 引用构造器ClassName::new

通过使用方法引用和构造器引用,可以显著减少代码量,提高代码的可读性和可维护性。掌握这些特性后,可以更好地利用它们来编写高效、简洁的 Java 应用程序。


原文地址:https://blog.csdn.net/yuehua00/article/details/142737421

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!