java8的Supplier

TOC

java8的Supplier

参考:

java.util.function.Supplier

定义

supplier也是是用来创建对象的,但是不同于传统的创建对象语法:new,每次调用get()方法时都会调用构造方法创建一个新对象

public class TestSupplier {
    private int age;
    TestSupplier(){
        System.out.println(age);
    }
    public static void main(String[] args) {
//创建Supplier容器,声明为TestSupplier类型,此时并不会调用对象的构造方法,即不会创建对象
        Supplier<TestSupplier> sup= TestSupplier::new;
        System.out.println("--------");
//调用get()方法,此时会调用对象的构造方法,即获得到真正对象
        sup.get();
//每次get都会调用构造方法,即获取的对象不同
        sup.get();
    }
}
输出结果:
--------
0
0

源码

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

案例

类似多例调用

    @Bean
    public Supplier<User> hbaseConnSupplier() {
        return () -> {
            User user = new User((int) (Math.random() * 1000));
            System.out.println("调用了hbaseConnSupplier,User:id:" + user.getId());
            return user;
        };
    }

controller调用

    @Autowired
    private Supplier<User> hbaseConnSupplier;
    @RequestMapping("/test2")
    public void test2(){
        User user = hbaseConnSupplier.get();
        System.out.println("test2:user:id:"+ user.getId());
        System.out.println("test2:user:id2:"+ user.getId());
        user=hbaseConnSupplier.get();
        System.out.println("test2:user:id3:"+ user.getId());
        System.out.println("----------------------");
    }

输出

调用了hbaseConnSupplier,User:id:286
test2:user:id:286
test2:user:id2:286
调用了hbaseConnSupplier,User:id:13
test2:user:id3:13
----------------------

每次调用get方法都获取一个新的User





原文地址:https://www.cnblogs.com/ziyue7575/p/a261a94b01777681c6db06b1be2ddff8.html