Rumah  >  Artikel  >  Java  >  Apakah cara untuk mengisih menggunakan aliran dan pembanding tersuai dalam Java 8?

Apakah cara untuk mengisih menggunakan aliran dan pembanding tersuai dalam Java 8?

王林
王林ke hadapan
2023-05-07 21:46:061566semak imbas

Pengisihan aliran java8 dan pembanding tersuai

Gunakan SENARAI pengisihan aliran java 8 dan pembanding objek tersuai

Perbandingan utama ialah masa, tetapi masa adalah masa terkini, bandingkan dengan dalam java The ACSII kod perbandingan kaedah, jadi 2020 dan 2021 mesti 0 di hadapan, tetapi yang kita perlukan adalah tarikh terkini di hadapan, jadi kita terbalikkan hasil yang dikembalikan Biasanya, masa edit objek 1 dibandingkan dengan masa objek 2. Jika masa objek 1 adalah kurang daripada masa objek 2, 1 akan dikembalikan Jadi kita akan mendapati bahawa 2020 adalah di hadapan , -1 dalam tertib menurun dan 0 adalah sama dengan (Kelas String melaksanakan antara muka Sebanding.

Kaedah CompareTo mengembalikan 0 untuk kesamaan, 1 untuk tertib menaik dan -1 untuk tertib menurun mengapa penyongsangan diterbalikkan di sini?

Sebab selepas penyongsangan, 2021-09-06 boleh berada di hadapan. Anda boleh mengisih mengikut masa terkini.

如果有的java 8 stream 不懂的可以去看看哦

List<Map<String,Object>> resultList = null;

        Map<String,Object> ss1 = new HashMap<>();
        ss1.put("dictcode","2");
        ss1.put("DictValue","霓虹灯广告1");
        ss1.put("EditTime","2021-09-16 17:47:30");
        Map<String,Object> ss2 = new HashMap<>();
        ss2.put("dictcode","1");
        ss2.put("DictValue","霓虹灯广告2");
        ss2.put("EditTime","2020-04-16 17:47:30");
        Map<String,Object> ss3 = new HashMap<>();
        ss3.put("dictcode","21");
        ss3.put("DictValue","霓虹灯广告3");
        ss3.put("EditTime","2020-09-13 17:47:30");
        Map<String,Object> ss4 = new HashMap<>();
        ss4.put("dictcode","3");
        ss4.put("DictValue","霓虹灯广告4");
        ss4.put("EditTime","2020-09-16 17:47:30");
        Map<String,Object> ss5 = new HashMap<>();
        ss5.put("dictcode","4");
        ss5.put("DictValue","霓虹灯广告5");
        ss5.put("EditTime","2020-09-16 17:47:30");

        List<Map<String, Object>> maps = Arrays.asList(ss1, ss2, ss3, ss5, ss4);

        //默认按edittime排序,如果时间相同或者为空,则按照code排序
        maps.stream().sorted((o1, o2) -> {
            if (StringUtils.isEmpty(o1.get("EditTime").toString()) || StringUtils.isEmpty(o2.get("EditTime").toString())) {
                return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
            } else if (o1.get("EditTime").equals(o2.get("EditTime"))) {
                return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
            } else
                if (o1.get("EditTime").toString().compareTo(o2.get("EditTime").toString()) > 0)
                    return -1;
                 else return 1;
            /*if (StringUtils.isEmpty(o1.get("EditTime").toString())||StringUtils.isEmpty(o2.get("EditTime").toString())
            || o1.get("EditTime").equals(o2.get("EditTime"))) {
                return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
            }
            else {
               if (o1.get("EditTime").toString().compareTo(o2.get("EditTime").toString()) >0)
                   return -1;
               return 1;
            }*/
        }).collect(Collectors.toList()).forEach(System.out::println);

masalah pengisihan strim java

Apabila memproses data, kita selalunya perlu mengisih dan kemudian kembali ke panggilan bahagian hadapan Contohnya, mengisih dalam urutan masa menaik, bahagian hadapan data paparan diisih mengikut masa .

Di sini anda boleh menggunakan kaedah strim sorted() untuk melaksanakan pengisihan tersuai

Mari kita bincangkan tentang penggunaan

Data contoh di sini ialah koleksi senarai, List

Kod adalah seperti berikut:

list.stream().sorted(Comparator.comparing(o->new Integer(o.getMonth()))).collect(Collectors.toList());

Nota:

Parameter dalam pembanding di sini menggunakan ungkapan Lambda, Integer baharu(o.getMonth()), yang dikapsulkan ke dalam Integer Jenisnya adalah kerana atribut bulan dalam kelas entiti Data yang kami reka adalah daripada jenis String, bukan Integer Penukaran kepada Integer adalah untuk penghakiman traversal bulan berikutnya Jika atribut adalah Bulan Integer, rujukan kaedah kelas tersebut ditakrifkan secara langsung dalam pembanding

Atas ialah kandungan terperinci Apakah cara untuk mengisih menggunakan aliran dan pembanding tersuai dalam Java 8?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam