Javaでリスト内の要素を見つける方法
1概要
リストから要素を見つけることは、開発者として遭遇する非常に一般的な作業です。
このクイックチュートリアルでは、Javaを使ってこれを実現するさまざまな方法について説明します。
2セットアップ
Customer
POJOを定義することから始めましょう:
public class Customer {
private int id;
private String name;
//getters/setters, custom hashcode/equals
}
そしてリンク:/java-arraylist[
ArrayList
]の顧客:
List<Customer> customers = new ArrayList<>();
customers.add(new Customer(1, "Jack"));
customers.add(new Customer(2, "James"));
customers.add(new Customer(3, "Kelly"));
Customer
クラスの
hashCode
と
equals
はオーバーライドされています。
現在の
equals
の実装に基づいて、同じ
id
を持つ2つの
Customer
オブジェクトは等しいと見なされます。
私たちはこの「顧客」のリストを途中で使います。
** 3 Java APIを使用する
**
Java自体がリストから項目を見つけるためのいくつかの方法を提供します。
-
contains
メソッド
-
__indexOf
__method
-
ループのためのアドホック
-
__Stream
__API
3.1.
contains()
List
は
contains
というメソッドを公開しています。
boolean contains(Object element)
名前が示すように、このメソッドは、リストに指定された
element、
が含まれている場合は
true
を返し、それ以外の場合は
false
を返します。
リストに特定の項目が存在するかどうかを確認するだけでよい場合は、次のようにします。
Customer james = new Customer(2, "James");
if (customers.contains(james)) {
//...
}
3.2.
の指標()
indexOf
は、要素を見つけるためのもう1つの便利な方法です。
int indexOf(Object element)
このメソッドは、指定されたリスト内で指定された
element
が最初に出現した位置のインデックスを返します。リストに
element
が含まれていない場合は-1を返します。
論理的には、このメソッドが-1以外のものを返す場合、リストに要素が含まれていることがわかります。
if(customers.indexOf(james) != -1) {
//...
}
このメソッドを使用する主な利点は、与えられたリスト内の指定された要素の位置を知ることができるということです。
** 3.3. 基本的なループ
**
しかし、要素をフィールドベースで検索したいとしたらどうでしょうか。宝くじを発表しているとしましょう。そして、特定の
name
を持つ
Customer
を勝者として宣言する必要があります。
このようなフィールドベースの検索では、繰り返しに進むことができます。
リストを反復処理する伝統的な方法は、
Javaのlooping
構造のうちの1つを使うことです。各反復で、リスト内の現在の項目と、一致するかどうかを確認するために探している要素とを比較します。
public Customer findUsingEnhancedForLoop(
String name, List<Customer> customers) {
for (Customer customer : customers) {
if (customer.getName().equals(name)) {
return customer;
}
}
return null;
}
ここで、
name
は、指定された
customers
のリストで検索している名前を表します。このメソッドは、一致する
name
を持つリスト内の最初の
Customer
オブジェクトを返します。そのような
Customer
が存在しない場合は
null
を返します。
3.4.
Iterator
でループする
Iterator
はアイテムのリストをたどることができるもう一つの方法です。
前の例を見て、少し微調整します。
public Customer findUsingIterator(
String name, List<Customer> customers) {
Iterator<Customer> iterator = customers.iterator();
while (iterator.hasNext()) {
Customer customer = iterator.next();
if (customer.getName().equals(name)) {
return customer;
}
}
return null;
}
そしてその振る舞いは以前と同じです。
3.5. Java 8
Stream
API
Java 8以降では、/java-8-streams[
Stream
APIを使用]をリンクして__Listの要素を見つけることもできます。
与えられたリストの中で特定の基準に一致する要素を見つけるために、
-
リストの
stream()
を呼び出す -
適切な
Predicate
を指定して
filter()
メソッドを呼び出す -
最初の要素を返す
__findAny()
__constructを呼び出します。
そのような要素が存在する場合、
Optional
でラップされた
filter
述部と一致します
**
Customer james = customers.stream()
.filter(customer -> "James".equals(customer.getName()))
.findAny()
.orElse(null);
便宜上、
Optional
が空の場合はデフォルトで
null
を使用しますが、これがすべてのシナリオで常に最良の選択とは限りません。
4第三者のライブラリ
さて、Stream APIでは十分ですが、
以前のバージョンのJavaを使い続けた場合はどうすればよいですか。
幸いなことに、Google GuavaやApache Commonsのような私たちが使用できるサードパーティ製のライブラリがたくさんあります。
4.1. Google Guava
Google Guavaには、ストリームでできることに似た機能があります。
Customer james = Iterables.tryFind(customers,
new Predicate<Customer>() {
public boolean apply(Customer customer) {
return "James".equals(customer.getName());
}
}).orNull();
Stream
APIを使用してできるので、
null
の代わりにデフォルト値を返すように選択することもできます。
Customer james = Iterables.tryFind(customers,
new Predicate<Customer>() {
public boolean apply(Customer customer) {
return "James".equals(customer.getName());
}
}).or(customers.get(0));
上記のコードは、一致するものが見つからなかった場合にリストの最初の要素を選びます。
-
リストまたは述語が
null
の場合、Guavaは
NullPointerException
をスローします。
4.2. Apache Commons
Apache Commonsを使用して、ほぼまったく同じ方法で要素を見つけることができます。
Customer james = IterableUtils.find(customers,
new Predicate<Customer>() {
public boolean evaluate(Customer customer) {
return "James".equals(customer.getName());
}
});
ただし、重要な違いがいくつかあります。
-
Apache Commonsは、
null
リストを渡すと
__null
__を返すだけです. -
** グアバのようにデフォルト値の機能を提供していません
tryFind
**
5結論
この記事では、____Listで要素を見つける方法、素早い存在チェックから始める方法、そしてフィールドベースの検索で終わる方法について学びました。
また、Java 8の
Streams
APIの代替として、サードパーティのライブラリである
Google Guava
および
Apache Commons
も調べました。
立ち寄ってくれてありがとう、そしてのためにすべてのソースをチェックするのを忘れないでください
これら
例https://github.com/eugenp/tutorials/tree/master/core-java-collections[over
GitHubで。