对于对象列表,我必须检查(某些)字段:
对该字段具有相同值的所有对象
对该字段具有不同值的所有对象
class Person {
final String name;
final int age;
final int group;
public Person( final String name, final int age, final int group ) {
this.name = name;
this.age = age;
this.group = group;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public int getGroup() {
return this.group;
}
}
public static <T> long distinctByField( final List<Person> personList, final Function<Person, T> field ) {
return personList.stream()
.map( field )
.distinct().count();
}
public static void main( final String[] args ) {
final List<Person> personList = Arrays.asList(
new Person( "Fred", 25, 1 ),
new Person( "Bill", 22, 1 ),
new Person( "Fred", 27, 1 ),
new Person( "Lisa", 25, 1 )
);
System.out.println( distinctByField( personList, Person::getName ) );
System.out.println( distinctByField( personList, Person::getAge ) );
System.out.println( distinctByField( personList, Person::getGroup ) );
}
根据stream/distinct/count的结果,我可以与当前列表大小进行比较:
if count==1:该字段具有相同值的所有对象
if count==list.size:该字段具有不同值的所有对象
缺点是,我必须为每一个感兴趣的领域流。
是否可以通过一个查询来实现这一点(对于感兴趣的字段列表)?
2条答案
按热度按时间5fjcxozz1#
可以使用反射:
3z6pesqy2#
首先让我提一下:这或多或少是代码质量的一个巨大缺点(手动搜索所有字段,使用一个额外的类来存储结果)。我怀疑,这在计算时间或内存方面会更有效。按照逻辑,您必须接触每个人的每个字段并存储已经发生的值,以便找到每个字段的不同计数。这正是你的3流解决方案所做的。我劝你还是坚持下去。
但这里有一个解决办法。我构建了一个收集器,它在一次运行中将每个字段的所有不同值收集到一个自定义类中。