So below I present the solution that I came up with. First, I group the collection / stream of Person as an attribute of Person.id, and then pass it on the elements of the map and filter out those that have at least one value that matches this discriminator.
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Person> persons = Arrays.asList(
new Person(1, "A"),
new Person(1, "B"),
new Person(1, "C"),
new Person(2, "B"),
new Person(2, "C"),
new Person(3, "A"),
new Person(3, "C"),
new Person(4, "B")
);
System.out.println(persons);
System.out.println(filterByDiscriminator(persons, "A"));
System.out.println(filterByDiscriminator(persons, "B"));
System.out.println(filterByDiscriminator(persons, "C"));
}
private static List<Person> filterByDiscriminator(List<Person> input, String discriminator) {
return input.stream()
.collect(Collectors.groupingBy(Person::getId))
.entrySet().stream()
.filter(entry -> entry.getValue().stream().noneMatch(person -> person.getDiscriminator().equals(discriminator)))
.flatMap(entry -> entry.getValue().stream())
.collect(Collectors.toList());
}
}
class Person {
private final Integer id;
private final String discriminator;
public Person(Integer id, String discriminator) {
Objects.requireNonNull(id);
Objects.requireNonNull(discriminator);
this.id = id;
this.discriminator = discriminator;
}
public Integer getId() {
return id;
}
public String getDiscriminator() {
return discriminator;
}
@Override
public String toString() {
return String.format("%s{\"id\": %d, \"discriminator\": \"%s\"}", getClass().getSimpleName(), id, discriminator);
}
}
jigga source
share