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());
      }
  });

ただし、重要な違いがいくつかあります。

  1. Apache Commonsは、

    null

    リストを渡すと

    __null

    __を返すだけです.

  2. ** グアバのようにデフォルト値の機能を提供していません


tryFind

**


5結論

この記事では、____Listで要素を見つける方法、素早い存在チェックから始める方法、そしてフィールドベースの検索で終わる方法について学びました。

また、Java 8の

Streams

APIの代替として、サードパーティのライブラリである

Google Guava

および

Apache Commons

も調べました。

立ち寄ってくれてありがとう、そしてのためにすべてのソースをチェックするのを忘れないでください
これら
例https://github.com/eugenp/tutorials/tree/master/core-java-collections[over
GitHubで。