我有一個地圖列表,其中每個地圖只有one key-value pair一個。我需要將其轉換為鍵列表。我正在嘗試按如下方式使用流:List<Map<Long, String>> lst = // some dataList<Long> successList = lst.stream().map(ele -> ele.keySet().toArray()[0]).collect(Collectors.toList());但我最終得到以下錯誤:java: incompatible types: inference variable T has incompatible bounds equality constraints: java.lang.Long lower bounds: java.lang.Object我該如何解決這個問題,或者有沒有更好的方法?
4 回答

侃侃無極
TA貢獻2051條經驗 獲得超10個贊
使用Stream#flatMap
如下:
lst.stream() .flatMap(e->e.entrySet().stream()) .map(e->e.getKey()) .collect(Collectors.toList());
編輯:( 根據評論)更優雅的方式將是使用 ofMap#keySet
而不是 Map#entrySet
.
lst.stream() .flatMap(e -> e.keySet().stream()) .collect(Collectors.toList());

米脂
TA貢獻1836條經驗 獲得超3個贊
你只需要:
List<Long> successList = lst.stream() .flatMap(e -> e.keySet().stream()) .collect(Collectors.toList());

Smart貓小萌
TA貢獻1911條經驗 獲得超7個贊
雖然已經發布了更好的答案(flatMap是你的朋友在這里),但我認為在這里值得指出的是,打字錯誤源于使用toArray無參數。
jshell> List<Long> a = Arrays.asList(1L, 2L, 3L, 4L)
a ==> [1, 2, 3, 4]
jshell> a.toArray()
$2 ==> Object[4] { 1, 2, 3, 4 }
看那邊?當你toArray不帶參數使用時,你會得到 type 的結果Object[]。所以改為這樣做:
jshell> a.toArray(new Long[1])
$3 ==> Long[4] { 1, 2, 3, 4 }
通過添加參數new Long[1],我們強制結果為toArray您想要的 Long 數組,而不是對象數組。
參見JavaDoc 中的“toArray”

當年話下
TA貢獻1890條經驗 獲得超9個贊
用這個:
lst.stream().flatMap(m -> m.entrySet().stream()).map(Map.Entry::getKey).collect(toList());
添加回答
舉報
0/150
提交
取消