我有两个类的结构是这样的:
public class Company {
private List<Person> person;
...
public List<Person> getPerson() {
return person;
}
...
}
public class Person {
private Double age;
...
public Double getAge() {
return age;
}
...
}
基本上,Company类有一个Person对象的List,每个Person对象都可以获得一个Age值。
如果我得到了Person对象的List,有没有一种好的方法可以使用Java 8来找到所有Person对象中的中位数Age值(Stream不支持中位数,但还有其他方法吗)?
Double medianAge;
if(!company.getPerson().isEmpty) {
medianAge = company.getPerson() //How to do this in Java 8?
}
6条答案
按热度按时间xggvc2p61#
您可以使用
这种方法的优点是它不修改列表,因此也不依赖于它的可变性。然而,这不一定是最简单的解决方案。
如果可以选择修改列表,则可以使用
而不是
xriantvc2#
强制性的Guava方式。
尽管Guava 31.1 Quantiles仍然标注为@Beta。
a5g8bdjr3#
下面是@Holger的答案的简化版本,它也适用于
IntStream
和LongStream
,并且在空流的情况下避免了NoSuchElementException
:如果列表为空,则返回
NaN
,而不是抛出NoSuchElementException
。如果您更喜欢抛出NoSuchElementException
,只需将.orElse(Double.NaN)
替换为.getAsDouble()
。jhkqcmku4#
下面是使用
Collectors.collectingAndThen
的一个流中的另一个解决方案它不修改现有列表或要求对它们进行排序。
qni6mghb5#
如果列表未排序,则可以使用以下代码:
utugiqy66#
你可以使用lambda表达式约简来获得列表的中位数: