所以下面我将介绍我想出的解决方案。首先,我按 Person.id 属性对输入的 Person 集合/流进行分组,然后流过映射条目并过滤掉那些至少有一个值与给定鉴别器匹配的条目。
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);
}
}