result = list.stream().collect(Collectors.groupingBy(q -> q.getBrand()));
这样分组后,得到的数据结构,key是分组的组名,我想要的是可以重构这个分组后的数据结构,用myKey:key,myValue:当前组对应的分组的数据
应该怎么一句话写完?因为我现在没办法,只能再写一个循环,来构造这个结构。
ringa_lee
groupingBy 1 パラメーター メソッドを使用しています。このメソッドは、キー マッピング関数として 1 つの Function のみを渡すことができます。 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,所以你就可以采用Collectors.groupingBy两个参数的方法,如下可以看到,第二个参数是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<String, List>
因为不知道你那个集合数据类型,所以不好根据你的来举例,我可以写一些我的小例子
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 には最大 3 つのパラメーターがあり、他の 2 つのパラメーターと 1 つのパラメーターは 3 つのパラメーターのメソッドのオーバーロードにすぎないため、Value データを取得した後にグループ化を処理する必要があります。 、3 パラメーターのメソッドがどのような機能を提供するかを理解する必要があります
Collectors
を使用できます。 Collectors.groupingBy
groupingBy
1 パラメーター メソッドを使用しています。このメソッドは、キー マッピング関数として 1 つのFunction
のみを渡すことができます。groupingBy
一个参数的方法,该方法只能传参一个Function
作为Key的映射函数但是其实
Collectors.groupingBy
最多是有三个参数的方法的,其他两个参数的还有一个参数的都是三个参数的方法的重载而已,所以你要达到处理分组后的Value数据,就需要了解根本上三个参数的方法到底提供了哪些能力可以看到有三个参数,第一个参数就是key的
Function
了,第二个参数是一个map工厂,也就是最终结果的容器,一般默认的是采用的HashMap::new
,最后一个参数很重要是一个downstream
,类型是Collector
,也是一个收集器,那就是说,这三个参数其实就是为了解决分组问题的第一个参数:分组按照什么分类
第二个参数:分组最后用什么容器保存返回
第三个参数:按照第一个参数分类后,对应的分类的结果如何收集
综上所诉,你需要对第三个参数进行传参就可以达到你要的目的了
由于之前说到的,第二个参数默认是
HashMap::new
,所以你就可以采用Collectors.groupingBy
两个参数的方法,如下可以看到,第二个参数是HashMap::new
其实一个参数的
Collectors.groupingBy
方法的第三个参数收集器其实默认是Collectors.toList
,所以你上面写的返回最终的类型是Map<String, List>
因为不知道你那个集合数据类型,所以不好根据你的来举例,我可以写一些我的小例子
反正第三个参数收集器你还可以根据
リーリー 🎜 3 つのパラメータがあることがわかります。最初のパラメータはキーのCollectors
しかし、実際には、Collectors.groupingBy
には最大 3 つのパラメーターがあり、他の 2 つのパラメーターと 1 つのパラメーターは 3 つのパラメーターのメソッドのオーバーロードにすぎないため、Value データを取得した後にグループ化を処理する必要があります。 、3 パラメーターのメソッドがどのような機能を提供するかを理解する必要がありますFunction
で、通常は、最終結果のコンテナです。HashMap::new
を使用します。最後のパラメータは非常に重要です。これはdownstream
です。タイプはCollector
で、コレクタでもあります。つまり、これら 3 つのパラメーターは、実際にはグループ化の問題を解決するためだけに使用されます🎜前述したように、2 番目のパラメータはデフォルトで
HashMap::new
に設定されているため、を使用できます。 Collectors.groupingBy
の 2 つのパラメーターからなるメソッド。以下に示すように、2 番目のパラメーターはHashMap::new
です🎜 リーリー 🎜実際、1 パラメーターのCollectors.groupingBy
メソッドの 3 番目のパラメーター コレクターは実際にはデフォルトでCollectors.toList
になっているため、上で書いたものによって返される最終的な型は マップ🎜 🎜コレクションのデータ型がわからないので、例をいくつか挙げることはできません🎜 リーリー 🎜 とにかく、Collectors
で多くの 3 番目のパラメーター コレクターを見つけることができます。それが機能しない場合は、コレクターをカスタマイズできます。