Tri personnalisé de la liste des objets à l'aide de Java Stream

Feb 11 2023
Parfois, vous devez trier la liste des objets de sorte que peu d'éléments soient triés par ordre croissant et que peu d'éléments soient triés par ordre décroissant. Disons que vous avez ci-dessous la classe Java POJO : nous pouvons écrire des comparateurs séparés pour chaque attribut à utiliser dans le tri.
Java

Parfois, vous devez trier la liste des objets de sorte que peu d'éléments soient triés par ordre croissant et que peu d'éléments soient triés par ordre décroissant .

Disons que vous avez ci-dessous la classe Java POJO :

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. la liste sera triée par ordre croissant de distanceFromMyLocation
  2. la liste sera triée par ordre décroissant de la note du vendeur
  3. la liste sera triée par ordre croissant de sellerName
  4. la liste sera triée par ordre croissant de sellerState

Nous pouvons écrire des comparateurs séparés pour chaque attribut à utiliser dans le tri.

Code Java :

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)