Java8函数式编程入门 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

方法引用

方法引用是Java8中提出的用来简化Lambda表达式的一种手段,它通过类名和方法名来定位一个静态方法或者实例方法。方法引用使用"::"定义,"::"的前半部分表示类名或者实例名,后半部分表示方法名称,如果是构造器函数,则使用new表示。

1、静态方法引用:ClassName::methodName

List<String> strs = Arrays.asList("aa","bb","cc");
strs.forEach(System.out::println);

输出结果:

query

2、实例方法引用:instanceRefence::methodName

class Printer {

    void print(){
        System.out.println("instanceRefence::methodName");
    }

    private void printInfo(){
        //实例方法引用
        new Thread(this::print);
    }
}
//测试
private void test() {
    Printer p = new Printer();
    p.print();
}

输出结果:

query

3、构造方法引用:Class::new

public class Test {

    class User {
        String username;

        User(String username){
            this.username = username;
        }

        public String getUsername(){
            return username;
        }
    }

    @FunctionalInterface
    interface UserFactory<T extends User> {
        T create(String username);
    }

    public static void main(String[] args) {
        Test t = new Test();
        t.test();
    }

    private void test() {
        UserFactory<User> uf = User::new;
        List<User> users = new ArrayList<>();
        for (int i = 0; i < 5; ++i) {
            users.add(uf.create("user"+i));
        }
        users.stream().map(User::getUsername).forEach(System.out::println);
    }
}

UserFactory作为User的工厂类,是一个函数式接口。当使用User::new创建接口实例时,系统会根据UserFactory.create()的函数签名选择合适的User构造函数。在创建UsrFactory实例后,对UsrFactory.create()的调用都会委托给User的实际构造函数进行,从而创建User对象实例。User::getUsername表示User类的实例方法。

输出结果:

query

练习静态方法引用,实例方法引用,构造方法引用