2017-04-21 64 views
1

我正在查看有關收集器的Java API。在Java API中分組是什麼意思以及如何使用它?

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#groupingBy-java.util.function.Function-java.util.function.Supplier-java.util.stream.Collector-

public static <T,K,D,A,M extends Map<K,D>> Collector<T,?,M> groupingBy(Function<? super T,? extends K> classifier, 
                     Supplier<M> mapFactory, 
                     Collector<? super T,A,D> downstream) 

類型參數:

筆 - 鍵

A的種類 - - 輸入元件

K的類型的中間下游收集器的積聚類型爲

d - 的類型所得到的地圖的

參數 - 下游還原

M的結果類型:

分類 - 分類器函數映射輸入元素鍵

下游的

- 執行下游還原的收集器

mapFactory - 一個函數,它被調用時,產生所需類型的一個新的空地圖

返回:

實現級聯組由操作

從第一收集器代碼行,我知道這是一個公共靜態方法,但<T, K, D, A, M extends Map<K, D>>是什麼意思?

然後從Collector<T, ?, M>,我可以理解它返回一個收集器,但是什麼是?的含義。

此外,我去了其中一個參數Supplier的頁面,由於它是一個功能接口,它只有一個抽象方法,稱爲get,但我根本不知道如何使用它。而我所經歷的這本書教導我們使用TreeMap::new

我的困惑在於,參數是如何實現接口的,但我們能夠使用方法引用呢?

在此先感謝!

+0

這對於單個問題可能太寬泛。你在這裏問過至少兩個,如果不是三個問題。 :-)泛型類型參數如何工作,如何將方法映射到函數接口... –

+1

例如,'>只是表示該方法將使用泛型類型參數稱爲'T','K','D','A'和'M',並且'M'必須擴展'Map '。但是這並不能回答你的整體問題...... –

回答

2
  1. <T, K, D, A, M extends Map<K, D>>意味着該方法使用5個一般類型參數 - TKDAM和其中M必須實現Map<K, D>

  2. ?表示通配符,即你不關心是什麼類型。請注意,這與添加另一個泛型類型參數不同。如果它是另一個泛型類型參數,例如U,則可以在代碼中稍後介紹。你護理關於它。

  3. Supplier表示不接受任何參數並返回某種類型值的方法。 TreeMap::new不帶參數,它給你一個TreeMap,所以這裏可以使用這個方法的參考。

1

<T,K,D,A,M extends Map<K,D>> - 這些是這個函數的通用參數,用作這個函數的參數和結果的通用參數。所以,你的參數必須是:

  • Function<? super T,? extends K> classifier - 函數,它T並返回K
  • Supplier<M> mapFactory - 供應商創建M
  • Collector<? super T,A,D> downstream - 集電極與TAD參數(看進一步的解釋和說明文件詳情)

而且這個功能還產生了Collector<T,?,M> - 這裏去TM。所有這些參數應該明確或隱含地指定。

關於收集器的參數,你可以去Collector documentation page看到,對於Collector類第二泛型參數是

減少操作(通常是隱藏的實施細節)

的可變積累型

通常,你不關心這種可變的累積類型,因爲最後你只需要結果,在這種情況下,它是M。我們還建議去documentation page。這是一個接口與一個方法T get()。而這個TreeMap::new可以表示爲() -> new TreeMap<>()。如果這還不清楚,那麼您可能需要閱讀一些關於匿名類,函數接口和lambda函數(以及方法引用)的一般教程。

相關問題