1


我有一个 ArrayList 人员(姓名、姓氏、年龄)。现在我想克隆这个 ArrayList 的一个子集。假设我想从中创建一个年龄 > 30 的新 ArrayList。
设置一个从 Person 读取所有属性并将其添加到新 ArrayList 的迭代并不太复杂。但是我只是想知道是否有更“优雅”并且可能更灵活的方式来实现这一点,也许实现我目前缺少的一些接口。只有一个要求:我想坚持使用基本的 Java JDK API,为此目的,合并一个外部库将是一种矫枉过正。
谢谢马克斯

4

4 回答 4

2

我知道你说过你不想使用外部库,但如果你确实选择了,这个片段会有所帮助:

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)
于 2012-10-27T13:09:44.740 回答
1

这种操作应该是使用 LINQ。但是 LINQ 在 Java 中尚不可用。按照计划,它将使用 Java 8。

但是在此之前,请尝试 LambdaJ http://code.google.com/p/lambdaj/

于 2012-10-27T13:44:07.540 回答
1

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.

于 2012-10-27T12:58:31.530 回答
0

Collections.binarySearch可能会为您解决问题。

在这里你可以找到一些例子。在对象中实现二分查找

于 2012-10-27T13:07:10.040 回答