Tuesday, May 29, 2018

Java 8 Stream- Remove first duplicate from list

Let's say we have a list of requests (SonarQubeProvisioning) that include a list of services.
I want a list of requests that do not include any duplicate services. 

@lombok.Value
@lombok.Builder(toBuilder = true, builderClassName = "Builder")
@lombok.NoArgsConstructor(force = true, access = lombok.AccessLevel.PRIVATE)
@lombok.AllArgsConstructor(access = lombok.AccessLevel.PRIVATE)

@JsonInclude(JsonInclude.Include.NON_EMPTY)
@Document(collection = "provisioning")
public class SonarQubeProvisioning implements Identifiable<ObjectId> {
  private List <SonarQubeService> service;
}




 List<SonarQubeProvisioning> provisions = provisioningRepository.findByStatus(QUEUED);

        //Remove Provisions that include a service that is currenlty being processed
        List<SonarQubeProvisioning> result = provisions.stream()
                .filter(provision ->
                        provisioningRepository.findByServiceIdAndStatus(provision.getService().getId(), IN_PROGRESS).isEmpty())
                .collect(Collectors.toList());

        //Get list of duplicates services
        Set<SonarQubeService> allItems = new HashSet<SonarQubeService>();
        Set<SonarQubeService> duplicates = result.stream().map(provision -> provision.getService())
                .filter(n -> !allItems.add(n)) //Set.add() returns false if the item was already in the set.
                .collect(Collectors.toSet());

        //Remove first duplicate request
        duplicates.forEach(service -> {
            IntStream.range(0, result.size())
                    .filter(i -> result.get(i).getService().equals(service))
                    .boxed()
                    .findFirst()
                    .map(i -> result.remove((int) i));
        });


No comments:

Post a Comment