Java 方法引用参数 对象值未变

在Java中,方法引用是一种简洁的方式来直接引用已经存在的方法。它可以使代码更加简洁、可读性更高,并且提高了代码的复用性。在方法引用中,有一个重要的概念是对象值未变。本文将介绍什么是方法引用、如何使用方法引用以及对象值未变的概念,并通过代码示例进行说明。

方法引用

方法引用是一种直接引用已经存在的方法的方式,它可以简化代码,降低代码的复杂度。在Java中,方法引用可以通过两种方式来实现:静态方法引用和实例方法引用。

静态方法引用

静态方法引用是指引用一个已经存在的静态方法。它的语法是类名::静态方法名。例如,我们有一个静态方法add,它接受两个整数并返回它们的和:

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

我们可以使用静态方法引用来引用这个方法:

IntBinaryOperator operator = MyMath::add;

上述代码中,IntBinaryOperator是一个函数式接口,它定义了一个接受两个int类型参数并返回int类型结果的方法。我们将静态方法引用MyMath::add赋值给operator变量,这样就可以通过operator来引用静态方法add

实例方法引用

实例方法引用是指引用一个已经存在的非静态方法。它的语法是对象名::方法名。例如,我们有一个类Person,它有一个非静态方法getName,它返回人的名字:

public class Person {
    private String name;
    
    public Person(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
}

我们可以创建一个Person对象,并使用实例方法引用来引用getName方法:

Person person = new Person("Alice");
Supplier<String> supplier = person::getName;

上述代码中,Supplier<String>是一个函数式接口,它定义了一个无参数的方法并返回String类型结果。我们将实例方法引用person::getName赋值给supplier变量,这样就可以通过supplier来引用实例方法getName

对象值未变

在方法引用中,一个重要的概念是对象值未变。当我们引用一个方法时,方法引用的参数是对象的引用,而不是对象的值。这意味着,如果方法引用的参数是一个可变对象,那么在方法引用中修改对象的状态将会影响到原始对象。

让我们通过一个示例来说明这个概念。假设我们有一个可变类Counter,它有一个实例方法increment用于增加计数器的值:

public class Counter {
    private int count;
    
    public Counter(int count) {
        this.count = count;
    }
    
    public void increment() {
        count++;
    }
    
    public int getCount() {
        return count;
    }
}

现在我们创建一个Counter对象,并使用实例方法引用来引用increment方法:

Counter counter = new Counter(0);
Runnable runnable = counter::increment;

上述代码中,Runnable是一个函数式接口,它定义了一个无参数的方法并返回void。我们将实例方法引用counter::increment赋值给runnable变量,这样就可以通过runnable来引用实例方法increment

如果我们调用runnable.run()方法两次,会发现counter的计数器值会增加两次:

runnable.run();
runnable.run();
System.out.println(counter.getCount()); // 输出 2

这是因为在方法引用中,runnable引用的是counter对象的increment方法,而不是对象的值。因此,每次调用runnable.run()方法时,都会修改counter对象的状态。

总结

方法引用是一种简洁、可读性高的方式来直接引用