Pertanyaan Bagaimana mengkonversi Peta ke Daftar di Java 8


Bagaimana cara mengonversi Map<String, Double> untuk List<Pair<String, Double>> di Java 8?

Saya menulis implementasi ini, tetapi tidak efisien

Map<String, Double> implicitDataSum = new ConcurrentHashMap<>();
//....
List<Pair<String, Double>> mostRelevantTitles = new ArrayList<>();
implicitDataSum.entrySet().stream().
                .sorted(Comparator.comparing(e -> -e.getValue()))
                .forEachOrdered(e -> mostRelevantTitles.add(new Pair<>(e.getKey(), e.getValue())));

return mostRelevantTitles;

Saya tahu itu harus digunakan .collect(Collectors.someMethod()). Tapi saya tidak mengerti cara melakukannya.


11
2018-01-30 21:49


asal


Jawaban:


Yah, kamu ingin mengumpulkan Pair elemen menjadi List. Itu berarti Anda perlu memetakan Anda Stream<Map.Entry<String, Double>> menjadi Stream<Pair<String, Double>>.

Ini dilakukan dengan map operasi:

Mengembalikan streaming yang terdiri dari hasil penerapan fungsi yang diberikan ke elemen aliran ini.

Dalam hal ini, fungsi akan menjadi fungsi yang mengonversi a Map.Entry<String, Double> menjadi Pair<String, Double>.

Akhirnya, Anda ingin mengumpulkannya menjadi List, jadi kita bisa menggunakan built-in toList() pengumpul.

List<Pair<String, Double>> mostRelevantTitles = 
    implicitDataSum.entrySet()
                   .stream()
                   .sorted(Comparator.comparing(e -> -e.getValue()))
                   .map(e -> new Pair<>(e.getKey(), e.getValue()))
                   .collect(Collectors.toList());

Perhatikan bahwa Anda dapat mengganti pembanding Comparator.comparing(e -> -e.getValue()) oleh Map.Entry.comparingByValue(Comparator.reverseOrder()).


18
2018-01-30 21:54



Perhatikan bahwa jika Anda mau efisien implementasi, Anda harus mempertimbangkan ini:

List<Pair<String, Double>> mostRelevantTitles = 
    implicitDataSum.entrySet()
                   .stream()
                   .map(e -> new Pair<>(e.getKey(), e.getValue()))
                   .collect(Collectors.toList());
mostRelevantTitles.sort(Comparators.comparing(Pair::getSecond, Comparator.reverseOrder()));

Saya berasumsi bahwa Anda Pair kelas miliki getSecond rajin.

Menggunakan sorted() stream langkah pipeline Anda membuat buffer intermediate, simpan semuanya ke buffer itu, ubah menjadi array, sortir array itu, lalu simpan hasilnya ke dalam ArrayList. Pendekatan saya, meskipun kurang berfungsi, menyimpan data langsung ke target ArrayList, kemudian mengurutkannya di tempat tanpa tambahan penyalinan. Jadi solusi saya akan membutuhkan lebih sedikit waktu dan memori menengah.


5
2018-02-01 04:57



    public List<TeamResult> process(final Map<String, Team> aggregatedMap) {
   return aggregatedMap.entrySet()
                       .stream()
                       .map(e -> new TeamResult(e.getKey(),e.getValue()))
                       .collect(Collectors.toList());
    }

0
2018-04-17 19:03