@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之类的东西?
答案 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);