1


Persons (名前、姓、年齢) の ArrayList があります。ここで、この ArrayList のサブセットだけを複製したいと思います。そこから年齢 > 30 の Persons の新しい ArrayList を作成したいとします。Person
からすべての属性を読み取り、それを新しい ArrayList に追加する反復を設定するのはそれほど複雑ではありません。ただし、これを達成するためのより「エレガント」で、おそらくより柔軟な方法があるかどうか、おそらく現時点で不足しているいくつかのインターフェイスを実装しているのではないかと思います。要件は 1 つだけです。基本的な 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 Librariesが必要です。基本的には、型パラメーターを持つ Predicate クラスを受け取る関数です。受け入れたい条件を返す「apply」メソッドが 1 つあります。

これが、人々が Java の使用を嘆く理由の 1 つです。適切な高階関数のサポートがありません。たとえば、Scala では、次のようにすることができます。

val greaterThan30 = persons.filter(_.age > 30)
于 2012-10-27T13:09:44.740 に答える
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 に答える
1

そのような操作はLINQを使用することになっています。ただし、LINQ はまだ Java で利用できません。計画によると、それは Java 8 になる予定です。

ただし、それが到着する前に、LambdaJ http://code.google.com/p/lambdaj/を試してください。

于 2012-10-27T13:44:07.540 に答える
0

Collections.binarySearchあなたのためにトリックを行うかもしれません。

ここにいくつかの例があります。オブジェクトに二分探索を実装する

于 2012-10-27T13:07:10.040 に答える