Penyortiran kustom daftar objek menggunakan Java Stream

Feb 11 2023
Terkadang Anda perlu mengurutkan daftar objek sedemikian rupa sehingga beberapa elemen diurutkan dalam urutan menaik dan beberapa elemen diurutkan dalam urutan menurun. Katakanlah Anda memiliki kelas Java POJO di bawah ini: Kita dapat menulis pembanding terpisah untuk setiap atribut yang akan digunakan dalam penyortiran.
Jawa

Terkadang Anda perlu mengurutkan daftar objek sedemikian rupa sehingga beberapa elemen diurutkan dalam urutan menaik dan beberapa elemen diurutkan dalam urutan menurun .

Katakanlah Anda memiliki kelas Java POJO di bawah ini:

package com.custom.sorting.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class Seller {
    String sellerName;
    Double distanceFromMyLocation;
    String sellerState;
    Double sellerRating;
}

  1. list akan diurutkan dalam urutan menaik dari distanceFromMyLocation
  2. daftar akan diurutkan dalam urutan menurun dari sellerRating
  3. list akan diurutkan dalam urutan menaik dari sellerName
  4. daftar akan diurutkan dalam urutan menaik dari sellerState

Kita dapat menulis pembanding terpisah untuk setiap atribut yang akan digunakan dalam penyortiran.

kode Jawa :

package com.custom.sorting.service;

import com.custom.sorting.model.Seller;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class CustomSorting {

    public static void main(String[] args) {
        List<Seller> sellerList = getSampleListOfSellers();

        //seller name comparator
        Comparator<Seller> sellerNameComparator = Comparator.comparing(Seller::getSellerName);

        //seller location distance comparator
        Comparator<Seller> sellerLocationDistanceComparator = Comparator.comparing(Seller::getDistanceFromMyLocation);

        //seller state comparator
        Comparator<Seller> sellerStateComparator = Comparator.comparing(Seller::getSellerState);

        //seller rating comparator
        Comparator<Seller> sellerRatingComparator = Comparator.comparing(Seller::getSellerRating);

        Comparator<Seller> finalComparator = sellerLocationDistanceComparator
                .thenComparing(sellerRatingComparator.reversed())
                .thenComparing(sellerNameComparator)
                .thenComparing(sellerStateComparator);

        List<Seller> sortedSellerList = sellerList.stream()
                .sorted(finalComparator)
                .collect(Collectors.toList());

        sortedSellerList.forEach(seller -> System.out.println(seller.toString()));
    }

    public static List<Seller> getSampleListOfSellers() {
        return Arrays.asList(
                getSeller("Alice", 60.0, "Goa", 3.8),
                getSeller("Bob", 12.0, "Delhi", 4.2),
                getSeller("Alex", 12.0, "Kerala", 4.5),
                getSeller("Roy", 56.7, "Maharashtra", 4.4),
                getSeller("Mark", 125.0, "Gujarat", 4.0),
                getSeller("Eric", 125.0, "Gujarat", 4.0)
        );
    }

    public static Seller getSeller(String sellerName,
                                   Double distanceFromMyLocation,
                                   String sellerState,
                                   Double sellerRating) {
        return Seller.builder().sellerName(sellerName)
                .distanceFromMyLocation(distanceFromMyLocation)
                .sellerState(sellerState)
                .sellerRating(sellerRating)
                .build();
    }

}

Seller(sellerName=Alex, distanceFromMyLocation=12.0, sellerState=Kerala, sellerRating=4.5)
Seller(sellerName=Bob, distanceFromMyLocation=12.0, sellerState=Delhi, sellerRating=4.2)
Seller(sellerName=Roy, distanceFromMyLocation=56.7, sellerState=Maharashtra, sellerRating=4.4)
Seller(sellerName=Alice, distanceFromMyLocation=60.0, sellerState=Goa, sellerRating=3.8)
Seller(sellerName=Eric, distanceFromMyLocation=125.0, sellerState=Gujarat, sellerRating=4.0)
Seller(sellerName=Mark, distanceFromMyLocation=125.0, sellerState=Gujarat, sellerRating=4.0)