java8 stream groupby后的数据结构是否可以重构
ringa_lee
ringa_lee 2017-04-18 10:17:57
0
1
935
result = list.stream().collect(Collectors.groupingBy(q -> q.getBrand()));

这样分组后,得到的数据结构,key是分组的组名,
我想要的是可以重构这个分组后的数据结构,用myKey:key,myValue:当前组对应的分组的数据

应该怎么一句话写完?因为我现在没办法,只能再写一个循环,来构造这个结构。

ringa_lee
ringa_lee

ringa_lee

membalas semua(1)
伊谢尔伦

Anda menggunakan groupingBy kaedah satu parameter, yang hanya boleh menghantar satu parameter Function sebagai fungsi pemetaan Kunci

Tetapi sebenarnya Collectors.groupingBy mempunyai kaedah dengan paling banyak tiga parameter Dua parameter lain dan satu parameter hanyalah lebihan daripada kaedah tiga parameter, jadi anda perlu memproses data Nilai terkumpul Anda perlu memahami keupayaan kaedah tiga parameter menyediakan

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

Anda boleh melihat bahawa terdapat tiga parameter Parameter pertama ialah kunci Function Parameter kedua ialah kilang peta, yang merupakan bekas hasil akhir satu ialah Parameter yang sangat penting ialah HashMap::new, jenisnya ialah downstream, dan ia juga merupakan pengumpul, maksudnya, ketiga-tiga parameter ini sebenarnya digunakan untuk menyelesaikan masalah pengelompokan Collector

  1. Parameter pertama: klasifikasi apakah berdasarkan kumpulan

  2. Parameter kedua: bekas apa yang digunakan untuk menyimpan kumpulan pada akhirnya dan mengembalikan

  3. Parameter ketiga: selepas mengelas mengikut parameter pertama, cara mengumpul hasil pengelasan yang sepadan

Untuk merumuskan perkara di atas, anda perlu lulus parameter ketiga untuk mencapai tujuan yang anda mahu

Seperti yang dinyatakan sebelum ini, parameter kedua lalai kepada
, jadi anda boleh menggunakan HashMap::newDua kaedah parameter, sebagai anda boleh lihat di bawah, parameter kedua ialah Collectors.groupingByHashMap::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);
    }
Malah, pengumpul parameter ketiga kaedah

satu parameter sebenarnya lalai kepada Collectors.groupingBy, jadi jenis terakhir yang dikembalikan oleh apa yang anda tulis di atas ialah Collectors.toListMap<String, List>

Oleh kerana saya tidak tahu jenis data koleksi anda, saya tidak boleh memberikan contoh kepada anda

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))));
Apa pun, anda juga boleh menemui banyak pengumpul parameter ketiga mengikut

Jika ia tidak berfungsi, anda boleh menyesuaikan pengumpul tersebut. Saya harap ia dapat membantu anda Collectors

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan