Ordenación personalizada de la lista de objetos usando Java Stream

Feb 11 2023
A veces es necesario ordenar la lista de objetos de modo que pocos elementos se clasifiquen en orden ascendente y pocos elementos se clasifiquen en orden descendente. Digamos que tiene debajo de la clase POJO de Java: podemos escribir comparadores separados para cada atributo que se usará en la clasificación.
Java

A veces es necesario ordenar la lista de objetos de modo que pocos elementos se clasifiquen en orden ascendente y pocos elementos se clasifiquen en orden descendente .

Digamos que tiene debajo de la clase 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 lista se ordenará en orden ascendente de distanciaDesdeMiUbicación
  2. la lista se ordenará en orden descendente de calificación del vendedor
  3. la lista se ordenará en orden ascendente de nombre del vendedor
  4. la lista se ordenará en orden ascendente de estado del vendedor

Podemos escribir comparadores separados para cada atributo que se utilizará en la clasificación.

Código 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)