我有一个 ArrayList 人员(姓名、姓氏、年龄)。现在我想克隆这个 ArrayList 的一个子集。假设我想从中创建一个年龄 > 30 的新 ArrayList。
设置一个从 Person 读取所有属性并将其添加到新 ArrayList 的迭代并不太复杂。但是我只是想知道是否有更“优雅”并且可能更灵活的方式来实现这一点,也许实现我目前缺少的一些接口。只有一个要求:我想坚持使用基本的 Java JDK API,为此目的,合并一个外部库将是一种矫枉过正。
谢谢马克斯
4 回答
我知道你说过你不想使用外部库,但如果你确实选择了,这个片段会有所帮助:
List<Person> persons = getSomePersons();
Collection<Person> greaterThan30 = Collections2.filter(persons, new Predicate<Person>() {
public boolean apply(Person person) {
return person.age > 30;
}
});
它需要Guava 库。基本上,它是一个接收带有类型参数的 Predicate 类的函数。它有一种“应用”方法,可以返回您想要接受的条件。
这也是人们抱怨使用 Java 的原因之一。没有适当的高阶函数支持。例如,在 Scala 中,您可以这样做:
val greaterThan30 = persons.filter(_.age > 30)
这种操作应该是使用 LINQ。但是 LINQ 在 Java 中尚不可用。按照计划,它将使用 Java 8。
但是在此之前,请尝试 LambdaJ http://code.google.com/p/lambdaj/
What you want is a filter, but there is no implementation of one in the Standard API library, and due to the lack of closures/lambdas, the implementations found in several third-party libraries such as lambdaj all have to be a bit more verbose than they would be in other languages. This will probably change in Java 8, though.
So just go ahead and do a loop - it's not as if there's something dirty about that, and even if there were a more elegant way, it would ultimately execute a loop as well.
Collections.binarySearch
可能会为您解决问题。
在这里你可以找到一些例子。在对象中实现二分查找