我有一个人员的ArrayList(姓名,年龄)。现在我想克隆这个ArrayList的一个子集。假设我想从中创建一个年龄> gt的人的新ArrayList。 30.
设置一个从Person读取所有属性并将其添加到新ArrayList的迭代并不太复杂。然而,我只是想知道是否有一个更“优雅”,也许更灵活,实现这一点的方式,可能实现我目前缺少的一些接口。只有一个要求:我想坚持使用基本的Java JDK API,为了这个目的,合并一个外部lib会是一种过分的做法。
谢谢
最大
答案 0 :(得分:2)
我知道你说你不想使用外部库,但是如果你选择了,那么这段代码会有所帮助:
List<Person> persons = getSomePersons();
Collection<Person> greaterThan30 = Collections2.filter(persons, new Predicate<Person>() {
public boolean apply(Person person) {
return person.age > 30;
}
});
它需要Guava Libraries。基本上它是一个带有类型参数的Predicate类的函数。它有一个方法“apply”,它返回你想要接受的条件。
这是人们哀叹使用Java的原因之一。没有适当的高阶函数支持。例如,在Scala中,您可以这样做:
val greaterThan30 = persons.filter(_.age > 30)
答案 1 :(得分:1)
你想要的是filter,但标准API库中没有一个实现,并且由于缺少闭包/ lambda,在{{{{{{{{ 3}}所有人都必须比在其他语言中更加冗长。但是,这可能会在Java 8中发生变化。
所以,继续做一个循环 - 这并不是说有什么东西是脏的,即使有更优雅的方式,它也最终会执行一个循环。
答案 2 :(得分:1)
这种操作应该是使用LINQ。但是,LINQ目前还没有Java版本。根据计划,它将在Java 8中。
然而,在此之前,请尝试LambdaJ http://code.google.com/p/lambdaj/
答案 3 :(得分:0)
Collections.binarySearch
可以帮你解决问题。
您可以在这里找到一些例子。 Implement binary search in objects