在对象列表中查找元素的最大大小

时间:2018-07-24 17:50:59

标签: java java-stream

@Data
class Person {

    private String fname;
    private String lname;

    private List<String> friends;
    private List<BigDecimal> ratings;

    ...
}

@Data
class People {

    private List<Person> people;

    ...
}

假设我有上述课程,并且需要弄清楚一个人拥有的最多朋友数。我知道流式处理的方法...通过遍历列表中的每个元素并 检查friends.size()是否大于当前存储的最长列表数。有没有一种方法可以简化流代码?像this answer之类的东西?

3 个答案:

答案 0 :(得分:7)

根据依赖于Person大小的比较器,计算People中包含的最大Person.getFriends()

Optional<Person> p = people.getPeople()
                           .stream()
                           .max(Comparator.comparingInt(p -> p.getFriends()
                                                           .size()));

请注意,您也可以只检索最多的朋友,而无需将Person关联到:

OptionalInt maxFriends = people.getPeople()
                               .stream()
                               .mapToInt(p -> p.getFriends()
                                               .size())
                               .max();

答案 1 :(得分:1)

您可以在Person类中声明以下方法:

public int getNumberOfFriends(){
   return friends.size();
}

然后在这样的流中使用它:

Optional <Person> personWithMostFriends = people.stream().max(Comparator.comparingInt(Person::getNumberOfFriends));

使用这种方法,您将得到Person对象,该对象拥有最多的朋友,而不仅仅是某人建议的最大数量的朋友。

答案 2 :(得分:1)

您的问题已经回答。但我将其添加为一件事。如果您的人数列表为,并且您具有多核计算机,并且您想有效地使用它,请使用 parallelstream()。 / p>

找人:

data['Position'] = data['Signal'].apply(slope_test(data['Signal']))

要获取尺寸:

Person person = people.getPeople()
.parallelStream()
.max(Comparator.comparingInt(p-> p.getFriends().size()))
.orElse(null);