2017-07-02 71 views
4

是否可以使用方法參考傳遞參數? 例如,我必須創建一個TreeMap,但使用reverseOrder()。 有沒有像TreeMap::new(reverseOrder())這樣的東西存在?方法參考中的參數

+2

方法引用是對現有方法的引用__。如果沒有現成的方法完全符合你的要求,那麼可以編寫這樣一個方法(然後捕獲對它的引用),或者使用一個lambda,它的主體做你想做的事情。 –

+0

另外[Java 8中的方法引用的外部參數](https://stackoverflow.com/questions/38697939/external-argument-to-method-reference-in-java-8)並可能[更多](https ://stackoverflow.com/search?q =參數+%22方法+參考%22) –

回答

6

不,你不能用一個方法引用做到這一點。

您可以使用lambda表達式來代替:

() -> new TreeMap<TheRelevantType>(reverseOrder()) 

() -> new TreeMap<>(reverseOrder()) 

如果您正在使用的情況下,其中的編譯器可以推斷TreeMap的元素類型此表達式。

+2

原始類型,真的嗎? – ZhekaKozlov

+0

@ZhekaKozlov好點,但不知道上下文,我不知道使用哪種元素類型。 – Eran

+0

@Eran沒有上下文,這是一個普遍的情況 –

5

您需要一個lambda表達式...你可能在想約Supplier

() -> new TreeMap<>(Comparator.reverseOrder()) 
+0

謝謝,我想象它不能完成 –

1

方法引用本身(今天)不支持這種方法,但有很多情況下方法引用可以與使用Eclipse Collections API的參數一起使用。看看下面的例子:

Map<String, TreeSet<String>> jdkMap = new HashMap<>(); 
jdkMap.put("one", new TreeSet<>(Comparator.reverseOrder())); 
jdkMap.computeIfAbsent("two", key -> new TreeSet<>(Comparator.reverseOrder())); 

MutableMap<String, TreeSet<String>> ecMap = 
     Maps.mutable.with("one", new TreeSet<>(Comparator.reverseOrder())); 
ecMap.getIfAbsentPutWith("two", TreeSet::new, Comparator.<String>reverseOrder()); 

Assert.assertEquals(jdkMap, ecMap); 

在這裏,我比較使用JDK的Map.computeIfAbsent()方法,這需要Function並通過了關鍵的參數,和Eclipse收藏MutableMap.getIfAbsentPutWith()方法,還需要一個Function並傳遞一個額外的參數。在JDK示例中,我必須使用lambda。在EC示例中,我能夠使用TreeSet::new構造函數引用,並指定Comparator.<String>reverseOrder()作爲我想要傳遞給它的參數。

有在Eclipse類別可用的許多*With方法(例如selectWithrejectWithcollectWithdetectWithanySatisfyWith等)。這些方法增加了可用於Java 8中方法引用的位置總數。

您將在Eclipse集合Katas中找到與參數一起使用的方法引用的示例。

Company Kata -> Exercise 2 Test
Pet Kata -> Exercise 2 Test

注:我的Eclipse集合的參與者。

1

您不能在Java中使用帶參數的方法引用。您必須使用lambda表達式來代替:

Supplier<Map<String, String>> factory =() -> 
     new TreeMap<>(Comparator.reverseOrder()); 

但是,如果出於某種原因,你想/需要反正使用的方法參考,這裏有一個方法用一個輔助方法來做到這一點:

public static <T, U> Supplier<T> withArg(
     Function<? super U, ? extends T> methodRef, 
     U arg) { 
    return() -> methodRef.apply(arg); 
} 

Supplier<Map<String, String>> factory = withArg(
     TreeMap::new, 
     Comparator.<String>reverseOrder());