我正在寻找一个给出原始集合A和类型T的方法来返回一个包含A中所有T类型对象的新集合。
我已经使用Person
类及其子类Man
和Woman
设置了测试,并设置了World
类以容纳Person
类{1}}对象。
public class World {
public World() {
this.people = new HashSet<Person>();
}
public void addPerson(Person person) {
getAllPeople().add(person);
}
public void removePerson(Person person) {
getAllPeople().remove(person);
}
public Set<Person> getAllPeople() {
return people;
}
public <T> Set<T> getAllPeople(Class<T> cls) {
Set<T> ItemsOfClass = new HashSet<>();
// Incompatible type error on next line
ItemsOfClass = getAllPeople().stream().filter(object -> object.getClass().equals(cls)).collect(Collectors.toSet());
return ItemsOfClass;
}
public Set<Person> people;
}
所以我希望getAllPeople(Man.class)
返回一组新的Man
个对象。
我目前对getAllPeople
的实施基于以下答案:https://stackoverflow.com/a/17840541和
https://stackoverflow.com/a/16727596
虽然我无法弄清楚它们应该如何组合在一起,如果有的话。
我不擅长仿制药,所以欢迎所有的解释/建议。
答案 0 :(得分:0)
您要将Stream<Person>
收集到Set<T>
。但是Stream<Person>
会生成Set<Person>
。
您可以将Person
个实例映射到T
个实例,并获得Stream<T>
。
public <T> Set<T> getAllPeople(Class<T> cls) {
Set<T> itemsOfClass = getAllPeople().stream()
.filter(cls::isInstance)
.map(cls::cast)
.collect(Collectors.toSet());
return itemsOfClass;
}
这使用cls::isInstance
作为谓词来查找类cls
和cls::cast
的元素作为映射器,将您的元素视为T
个实例而不是{{1实例。