result = list.stream().collect(Collectors.groupingBy(q -> q.getBrand()));
这样分组后,得到的数据结构,key是分组的组名,我想要的是可以重构这个分组后的数据结构,用myKey:key,myValue:当前组对应的分组的数据
应该怎么一句话写完?因为我现在没办法,只能再写一个循环,来构造这个结构。
ringa_lee
你採用的是groupingBy一个参数的方法,该方法只能传参一个Function作為Key的映射函數
groupingBy
Function
但是其實Collectors.groupingBy最多是有三個參數的方法的,其他兩個參數的還有一個參數的都是三個參數的方法的重載而已,所以你要達到處理分組後的Value數據,就需要了解根本上三個參數的方法到底提供了哪些能力
Collectors.groupingBy
Collector<T, ?, M> groupingBy(Function<? super T, ? extends K> classifier, Supplier<M> mapFactory, Collector<? super T, A, D> downstream) {
可以看到有三個參數,第一個參數就是key的Function了,第二个参数是一个map工厂,也就是最终结果的容器,一般默认的是采用的HashMap::new,最后一个参数很重要是一个downstream,类型是Collector,也是一個收集器,那就是說,這三個參數其實就是為了解決分組問題的
HashMap::new
downstream
Collector
第一個參數:分組依什麼分類
第二個參數:分組最後用什麼容器保存回
第三個參數:依照第一個參數分類後,對應的分類的結果如何收集
綜上所訴,你需要對第三個參數進行傳參就可以達到你要的目的了由於之前說到的,第二個參數默認是HashMap::new,所以你就可以採用HashMap::new,所以你就可以采用Collectors.groupingBy两个参数的方法,如下可以看到,第二个参数是HashMap::new兩個參數的方法,如下可以看到,第二個參數是HashMap::new
public static <T, K, A, D> Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier, Collector<? super T, A, D> downstream) { return groupingBy(classifier, HashMap::new, downstream); }
其實一個參數的Collectors.groupingBy方法的第三个参数收集器其实默认是Collectors.toList,所以你上面写的返回最终的类型是Map<String, List>方法的第三個參數收集器其實預設是Collectors.toList,所以你上面寫的回傳最終的型別是Map
Collectors.toList
Map<String, List>
Map
因為不知道你那個集合資料型,所以不好根據你的來舉例,我可以寫一些我的小例子
Student String type int score String name List<Student> students = new ArrayList<>() // 每个学生类型的总分数 Map<String, Integer> map1 = students.stream.collect(Collectors.groupingBy(Student::getType, Collectors.summingInt(Student::getScore)))); // 每个学生类型中的得分最高的那个学生 Map<String, Optional<Student>> map2 = students.stream.collect(Collectors.groupingBy(Student::getType, Collectors.maxBy(Comparator.comparing(Student::getScore))));
反正第三個參數收集器你還可以根據Collectors裡找到很多,實在不行可以自訂收集器的,希望能幫到你
Collectors
你採用的是
groupingBy
一个参数的方法,该方法只能传参一个Function
作為Key的映射函數但是其實
Collectors.groupingBy
最多是有三個參數的方法的,其他兩個參數的還有一個參數的都是三個參數的方法的重載而已,所以你要達到處理分組後的Value數據,就需要了解根本上三個參數的方法到底提供了哪些能力可以看到有三個參數,第一個參數就是key的
Function
了,第二个参数是一个map工厂,也就是最终结果的容器,一般默认的是采用的HashMap::new
,最后一个参数很重要是一个downstream
,类型是Collector
,也是一個收集器,那就是說,這三個參數其實就是為了解決分組問題的第一個參數:分組依什麼分類
第二個參數:分組最後用什麼容器保存回
第三個參數:依照第一個參數分類後,對應的分類的結果如何收集
綜上所訴,你需要對第三個參數進行傳參就可以達到你要的目的了
由於之前說到的,第二個參數默認是
HashMap::new
,所以你就可以採用HashMap::new
,所以你就可以采用Collectors.groupingBy
两个参数的方法,如下可以看到,第二个参数是HashMap::new
兩個參數的方法,如下可以看到,第二個參數是HashMap::new
其實一個參數的
Collectors.groupingBy
方法的第三个参数收集器其实默认是Collectors.toList
,所以你上面写的返回最终的类型是Map<String, List>
方法的第三個參數收集器其實預設是Collectors.toList
,所以你上面寫的回傳最終的型別是Map
因為不知道你那個集合資料型,所以不好根據你的來舉例,我可以寫一些我的小例子
反正第三個參數收集器你還可以根據
Collectors
裡找到很多,實在不行可以自訂收集器的,希望能幫到你