Classificação personalizada da lista de objetos usando o Java Stream
Feb 11 2023
Às vezes, você precisa classificar a lista de objetos de forma que poucos elementos sejam classificados em ordem crescente e poucos elementos sejam classificados em ordem decrescente. Digamos que você tenha abaixo da classe Java POJO: Podemos escrever comparadores separados para cada atributo a ser usado na classificação.
Às vezes, você precisa classificar a lista de objetos de forma que poucos elementos sejam classificados em ordem crescente e poucos elementos sejam classificados em ordem decrescente .
Digamos que você tenha abaixo da 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;
}
- a lista será classificada em ordem crescente de distanceFromMyLocation
- a lista será classificada em ordem decrescente de sellerRating
- a lista será classificada em ordem crescente de sellerName
- a lista será classificada em ordem crescente de sellerState
Podemos escrever comparadores separados para cada atributo a ser usado na classificação.
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)
Christopher Nolan uma vez se arrependeu de ter lido o 'roteiro de Pulp Fiction' de Quentin Tarantino





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)