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






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM