Java中::的含义

发布时间:2023-05-23

一、基本介绍

Java中::被称为方法引用(Method Reference),其实就是Lambda表达式的一种简化写法。 从Java 8开始,Lambda表达式被广泛使用,但是当Lambda表达式比较复杂时,可以利用::简化Lambda表达式的写法。::是用来访问类方法、构造方法或者实例方法的。

二、静态方法引用

静态方法引用是指引用一个静态方法,通过类名::methodName的方式进行引用。

public class MethodReferenceDemo {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Jennifer", "Kenny", "Alice");
        names.forEach(System.out::println);
    }
}

上面的代码中,使用::引用了System.outprintln方法。这种写法等价于使用Lambda表达式:

names.forEach(name -> System.out.println(name));

静态方法引用可以减少代码量,使用更加简洁,易于阅读和维护。

三、对象方法引用

对象方法引用是指引用一个对象的方法,通过对象名::methodName的方式进行引用。

class Rect {
    private int width;
    private int height;
    public Rect(){}
    public Rect(int width, int height) {
        this.width = width;
        this.height = height;
    }
    public int getWidth() { return width; }
    public int getHeight() { return height; }
    public void setWidth(int width) { this.width = width; }
    public void setHeight(int height) { this.height = height; }
    public void print() { System.out.println("Width:" + width + " , Height:" + height); }
}
public class MethodReferenceDemo {
    public static void main(String[] args) {
        List<Rect> rects = Arrays.asList(new Rect(1, 3), new Rect(2, 5), new Rect(3, 8));
        rects.forEach(Rect::print);
    }
}

上面的代码中,使用::引用了Rect类的print方法。这种写法等价于使用Lambda表达式:

rects.forEach(rect -> rect.print());

对象方法引用可以让代码更加易读,可以直观地看到方法是被哪个对象调用的。

四、构造方法引用

构造方法引用是指引用一个构造方法,通过类名::new的方式进行引用。

class Person {
    private String name;
    private int age;
    public Person(String name) {
        this.name = name;
    }
    public Person(String name, int age) {
        this(name);
        this.age = age;
    }
    public void introduce() {
        System.out.println("Name:" + name + " , Age:" + age);
    }
}
public class MethodReferenceDemo {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Jennifer", "Kenny", "Alice");
        List<Person> persons = names.stream().map(Person::new).collect(Collectors.toList());
        persons.forEach(Person::introduce);
    }
}

上面的代码中,使用::引用了Person类的构造方法。这种写法等价于使用Lambda表达式:

List<Person> persons = names.stream().map(name -> new Person(name)).collect(Collectors.toList());

构造方法引用可以避免手动实现工厂方法,降低代码的复杂度。

五、总结

Java中的::被称为方法引用,用于简化Lambda表达式的写法。::可以引用静态方法、对象方法和构造方法。静态方法引用可以减少代码量,使得代码更加简洁易读;对象方法引用可以让代码更加易读,可以直观地看到方法是被哪个对象调用的;构造方法引用可以避免手动实现工厂方法,降低代码的复杂度。