2016-07-14 46 views
1

爲什麼不能編譯?方法參考不編譯 - 整數::新

​​

它給人的錯誤

令牌

語法錯誤的 「新」,AssignmentOperator預計此令牌

當然,我可以重寫這個表達式後

Stream.generate(() -> new Integer(1)).limit(10); 

但我想知道第一個陳述失敗的原因...

+2

您不能爲方法引用提供附加參數。所以你必須改用lambda表達式。但是使用Integer的構造函數無論如何都是荒謬的。您可以使用'Stream.generate(( - ) - > 1)... – Holger

+2

因爲'Integer :: new(1)'不是有效的方法/構造函數引用。 [JLS](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.13) – Flown

回答

3

您不能將參數明確地傳遞給方法引用。他們只能隱式傳遞。

例如,如果你有一個IntStream,可以將其使用public Integer(int value)構造的方法參考mapToObjInteger實例:

IntStream.of(1,1,1).mapToObj(Integer::new)... 

當然,使用public Integer(int value)構造爲小int值通常一不好的想法,因爲它可能會導致創建所有具有相同值的不必要的多個實例,而不是利用IntegerCache,它們緩存小值(-128到127)的實例。

+2

或'IntStream.of(1,1,1).boxed( )'以避免過時的實例創建... – Holger

+2

@Holger是的,我從來沒有說過這個代碼是有道理的。我只演示瞭如何使用方法引用來調用Integer(int)構造函數。 – Eran

+1

我會說,使用自動裝箱或顯式的'Integer.valueOf',應該是首選的方式,無論實際的'int'值。的確,只有很小的值才能保證被緩存,但這並不妨礙其他緩存,並且使用工廠也會記錄開發人員對對象身份沒有任何假設,換句話說,通常允許緩存,無論是否會發生與否。即使JVM端優化也是可能的,因爲JVM知道這種方法。 – Holger