Persons (名前、姓、年齢) の ArrayList があります。ここで、この ArrayList のサブセットだけを複製したいと思います。そこから年齢 > 30 の Persons の新しい ArrayList を作成したいとします。Person
からすべての属性を読み取り、それを新しい ArrayList に追加する反復を設定するのはそれほど複雑ではありません。ただし、これを達成するためのより「エレガント」で、おそらくより柔軟な方法があるかどうか、おそらく現時点で不足しているいくつかのインターフェイスを実装しているのではないかと思います。要件は 1 つだけです。基本的な 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 Librariesが必要です。基本的には、型パラメーターを持つ Predicate クラスを受け取る関数です。受け入れたい条件を返す「apply」メソッドが 1 つあります。
これが、人々が Java の使用を嘆く理由の 1 つです。適切な高階関数のサポートがありません。たとえば、Scala では、次のようにすることができます。
val greaterThan30 = persons.filter(_.age > 30)
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.
そのような操作はLINQを使用することになっています。ただし、LINQ はまだ Java で利用できません。計画によると、それは Java 8 になる予定です。
ただし、それが到着する前に、LambdaJ http://code.google.com/p/lambdaj/を試してください。
Collections.binarySearch
あなたのためにトリックを行うかもしれません。
ここにいくつかの例があります。オブジェクトに二分探索を実装する