【发布时间】:2016-03-16 15:41:45
【问题描述】:
我正在尝试过滤一个城市中的一组person,以使他们的平均年龄大于数据库中具有最早created_at 时间戳的人的年龄。
我正在做类似下面的事情,
LinkedBlockingDeque<Person> allAges = null;
LinkedBlockingDeque<Person> filteredAges = new LinkedBlockingDeque<Person>();
allAges = ageStorage.getAllAgesByCityOrderByInsertionTime("city A");
allAges.stream()
.filter(this.getFirstInsertedAgeGreaterThanAverage(allAges))
.forEach(filteredAges::add);
而getFirstInsertedAgeGreaterThanAverage如下,
private static Predicate<Integer> getFirstInsertedAgeGreaterThanAverage(LinkedBlockingDeque<Person> personList){
return p -> (personList.stream().mapToInt(Person::getAge).average() >
personList.peekFirst().getAge());
}
我猜这里有些东西不太对劲,但不确定是什么...有没有办法可以在没有 getFirstInsertedAgeGreaterThanAverage 方法的情况下完成此操作
【问题讨论】:
-
可能有多种解决方案。你想保留哪一个?
-
如果您想要最大的此类子集,请按年龄对人员进行排序并将人员添加到集合中,从最老的开始,直到平均值略高于其他人的年龄。
-
另外,它必须使用流吗?在这里使用常规的旧 for 循环和一些辅助变量可能会容易得多。
-
这应该是一个技巧问题吗?平均值不可能大于最大值。通过选择最大/最旧元素本身(仅此而已),您可以获得的最大平均值就是最大值。或者,如果有多个元素,则可能所有元素的年龄都与最古老的元素相同。当然,选择其他任何东西都会有一个较小的平均值。
-
@g0c00l.g33k 如果任务是返回集合的平均年龄是否大于第一个插入的人的年龄,那是另一回事。您的
Predicate<Person>代码如所写为每个元素返回相同的结果,因为它没有检查您传递给谓词的Person p->的任何值。
标签: java filter java-8 java-stream deque