Groovyのcontainsメソッド活用方法を15の詳細なサンプルコードで完全解説

Groovyのcontainsメソッドを使ったプログラミングのイメージGroovy
この記事は約22分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Groovyは、その柔軟性とパワフルな機能で注目を集めています。

この記事では、特に「containsメソッド」というGroovyの鍵となる機能にフォーカスを当て、初心者から上級者まで、誰もがGroovyの魅力と効果的な使い方を理解できるように詳細に解説していきます。

具体的なサンプルコードを豊富に取り入れながら、このメソッドの基本から応用までを一つ一つ丁寧に学んでいきましょう。

●Groovyとは

GroovyはJavaプラットフォーム上で動作する動的なプログラミング言語です。

Javaとの高い互換性を持ちつつ、簡潔で読みやすい構文を実現しています。

この言語は、Javaの堅牢さとスクリプト言語の柔軟性を組み合わせたもので、開発者にとって非常に強力なツールとなっています。

Groovyは、スクリプト言語としての利便性と、コンパイル言語としてのパフォーマンスを兼ね備えており、多くの開発者に支持されています。

○Groovyの基本概要

Groovyは、Java Virtual Machine(JVM)上で動作する言語であり、Javaのライブラリと無縫に連携することができます。

また、Groovy独自の機能として、メタプログラミング、クロージャ、ビルダー構文などがあり、これらは開発者がより効率的かつ簡潔にコードを記述するのを助けます。

さらに、Groovyはオプショナルな型指定、オペレータのオーバーロードなど、柔軟な構文を備えており、これにより開発の生産性が向上します。

○なぜGroovyが選ばれるのか

Groovyが多くの開発者に選ばれる理由は、その使いやすさとパワフルな機能にあります。

GroovyはJavaコードをそのまま使用できるため、Java開発者は容易にGroovyの世界に入ることができます。

また、Groovyは動的な型付けを採用しているため、より簡潔なコードを書くことが可能です。

これにより、小規模なスクリプトから大規模なアプリケーション開発まで、幅広い用途で利用されています。

さらに、強力なコレクション処理機能や、独自のDSL(ドメイン特化言語)をサポートする機能も、Groovyが支持される大きな理由の一つです。

●containsメソッドの基本

Groovy言語におけるcontainsメソッドは、あるオブジェクトが指定された要素を含んでいるかどうかを確認するために使用されます。

このメソッドは、文字列、リスト、マップなど、様々なタイプのオブジェクトに対して利用可能です。

特に、文字列やコレクションの処理において非常に有用で、プログラミングにおける基本的な操作の一つと言えるでしょう。

○containsメソッドの概要

Groovyのcontainsメソッドは、指定された要素がオブジェクト内に存在するかどうかを確認する際に使用されます。

このメソッドは、boolean型(真偽値)を返し、要素が存在する場合はtrue、存在しない場合はfalseを返します。

たとえば、文字列の中に特定の文字列が含まれているか、リストに特定の要素が存在するかなどをチェックするのに役立ちます。

○containsメソッドの基本的な使い方

Groovyにおいてcontainsメソッドを使用する基本的な方法は、対象となるオブジェクトに対してcontainsメソッドを呼び出し、引数として探したい要素を渡すことです。

// 文字列の例
String str = "Hello, Groovy!"
boolean result = str.contains("Groovy")
println result // trueが出力される

// リストの例
List<String> list = ["apple", "banana", "cherry"]
result = list.contains("banana")
println result // trueが出力される

この例では、最初に文字列"Hello, Groovy!"に対して"Groovy"という文字列が含まれているかを確認しています。

次に、リストに"banana"が含まれているかをチェックしています。

どちらの例も、containsメソッドは指定された要素が存在するかどうかを確認し、結果として真偽値を返しています。

●containsメソッドの詳細な使い方

Groovy言語におけるcontainsメソッドの使い方は多岐にわたります。

ここでは、より具体的な使い方として、文字列の検索、リスト内の要素の確認、そしてマップのキーの存在確認に焦点を当てて、具体的なサンプルコードを通じてその使い方を解説します。

○サンプルコード1:文字列の検索

文字列内に特定の文字列が含まれているかどうかを確認する際にcontainsメソッドが非常に有効です。

下記のサンプルコードは、Groovyで文字列内に特定の単語が存在するかをチェックする方法を表しています。

String sampleText = "GroovyはJavaベースのプログラミング言語です。"
boolean containsJava = sampleText.contains("Java")
println "文字列に'Java'が含まれているか: $containsJava"

このコードでは、"GroovyはJavaベースのプログラミング言語です。"という文字列内に"Java"という単語が含まれているかを調べています。

結果はboolean型の変数containsJavaに格納され、trueが出力されることを期待します。

○サンプルコード2:リスト内の要素の確認

Groovyではリスト内の特定の要素が存在するかどうかも簡単にチェックできます。

下記のコードでは、リスト内に特定の要素が含まれているかどうかを確認しています。

List<String> fruits = ["apple", "orange", "banana"]
boolean containsBanana = fruits.contains("banana")
println "リストに'banana'が含まれているか: $containsBanana"

このコードでは、fruitsというリスト内に"banana"という要素が存在するかを確認しています。

"banana"がリスト内に存在するため、trueが出力されます。

○サンプルコード3:マップのキーの存在確認

Groovyにおいては、マップ(連想配列)のキーの存在も簡単にチェックできます。

下記のサンプルコードは、マップ内に特定のキーが存在するかどうかを確認する方法を表しています。

Map<String, Integer> stock = ["apple": 50, "orange": 30, "banana": 20]
boolean containsApple = stock.containsKey("apple")
println "マップに'apple'のキーが含まれているか: $containsApple"

このコードでは、stockというマップ内に"apple"というキーが存在するかをチェックしています。

"apple"というキーが存在するため、結果はtrueとなります。

○サンプルコード4:ケースインセンシティブな検索

Groovyにおけるcontainsメソッドの応用例として、ケースインセンシティブ(大文字小文字を区別しない)な検索があります。

この検索方法は、大文字小文字の違いを無視して文字列を検索する際に有効です。

下記のサンプルコードでは、Groovyでケースインセンシティブな検索を行う方法を表しています。

String sampleText = "Groovyは楽しいプログラミング言語です。"
String searchWord = "groovy"
boolean result = sampleText.toLowerCase().contains(searchWord.toLowerCase())
println "ケースインセンシティブ検索の結果: $result"

この例では、sampleTextsearchWordの両方を小文字に変換してからcontainsメソッドを使用しています。

これにより、大文字小文字の違いを無視した検索が可能になります。

結果はtrueとなり、期待通りの検索が行われることを示しています。

○サンプルコード5:正規表現を使用した検索

Groovyでは正規表現を用いたより高度な検索も行うことができます。

下記のサンプルコードでは、正規表現を使って特定のパターンに一致する文字列を検索する方法を表しています。

String sampleText = "Groovy 2.5.7, Java 11"
String pattern = /[0-9]+\.[0-9]+\.[0-9]+/ // バージョン番号のパターン
boolean result = sampleText =~ pattern
println "正規表現を使った検索の結果: $result"

このコードでは、/[0-9]+\.[0-9]+\.[0-9]+/という正規表現を用いて、バージョン番号のようなパターンに一致する文字列をsampleTextから探しています。

=~演算子はGroovyにおいて正規表現の一致を確認するために用いられます。

このサンプルでは、"2.5.7"というバージョン番号に一致する文字列が見つかるため、結果はtrueとなります。

○サンプルコード6:条件式を使った高度な検索

Groovyにおいては、より高度な検索処理を実現するために条件式を使った検索が可能です。

例えば、特定の条件を満たす要素がリストに含まれているかどうかを確認することができます。

下記のサンプルコードは、リスト内の要素が特定の条件を満たすかどうかを検索する方法を表しています。

List<Integer> numbers = [1, 2, 3, 4, 5]
boolean containsEven = numbers.any { it % 2 == 0 }
println "リストに偶数が含まれているか: $containsEven"

このコードでは、リストnumbers内の要素が偶数かどうかを確認しています。

anyメソッドを使って、リスト内の各要素に対して条件式it % 2 == 0(偶数かどうか)を適用し、その結果が真(true)の場合にcontainsEvenは真(true)となります。

○サンプルコード7:カスタムオブジェクトの検索

Groovyでは、カスタムオブジェクトのリスト内で特定のオブジェクトを検索することもできます。

下記のサンプルコードでは、カスタムオブジェクトのリストから特定の条件を満たすオブジェクトを検索する方法を表しています。

class Product {
    String name
    int price

    Product(String name, int price) {
        this.name = name
        this.price = price
    }
}

List<Product> products = [new Product("apple", 100), new Product("banana", 80)]
boolean containsExpensiveProduct = products.any { it.price > 90 }
println "高価な商品が含まれているか: $containsExpensiveProduct"

このコードでは、Productというクラスのインスタンスが格納されたリストproductsから、価格が90より高い商品が含まれているかどうかを検索しています。

anyメソッドを使い、各Productオブジェクトのprice属性が90より大きいかどうかを判断し、該当する商品が存在すればcontainsExpensiveProductは真(true)となります。

○サンプルコード8:複数条件の組み合わせ

Groovyでは、複数の条件を組み合わせた高度な検索を行うことができます。

このような検索は、特定の条件を満たす要素をリストやコレクションから見つけ出す際に役立ちます。

下記のサンプルコードでは、リスト内の要素が複数の条件を満たすかどうかを検索する方法を表しています。

List<Integer> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
boolean containsSpecificNumber = numbers.any { it > 5 && it % 2 == 0 }
println "リストに特定の条件を満たす数値が含まれているか: $containsSpecificNumber"

このコードでは、リストnumbers内の要素が5より大きく、かつ偶数であるかどうかを確認しています。

anyメソッドを用いて、各要素が条件it > 5 && it % 2 == 0を満たすかどうかを判断し、該当する要素が存在すればcontainsSpecificNumberは真(true)となります。

○サンプルコード9:例外処理の取り扱い

Groovyプログラミングにおいて、例外処理は重要な部分です。

containsメソッドを使用する際も、例外的な状況を適切に扱うことが必要になることがあります。

下記のサンプルコードでは、例外処理を含むcontainsメソッドの使用方法を表しています。

try {
    List<String> words = ["apple", "banana", "cherry"]
    boolean result = words.contains("orange")
    println "リストに'orange'が含まれているか: $result"
} catch (Exception e) {
    println "エラーが発生しました: ${e.message}"
}

このコードでは、wordsというリストに"orange"という要素が含まれているかどうかを確認しています。

万が一、リストがnullであるなどの例外的な状況が発生した場合、catchブロックがエラーメッセージを表示します。

これにより、プログラムの安定性を保ちながら、必要な検索処理を行うことができます。

○サンプルコード10:パフォーマンスの最適化

Groovyにおいてcontainsメソッドの使用は便利ですが、大きなデータセットや複雑な条件の検索ではパフォーマンスの観点から最適化が必要になることがあります。

下記のサンプルコードでは、パフォーマンスを考慮したcontainsメソッドの使用方法を表しています。

List<Integer> largeNumbers = (1..10000).toList()
boolean containsLargeNumber = largeNumbers.parallelStream().anyMatch { it > 9000 }
println "大きなリストに特定の数値が含まれているか: $containsLargeNumber"

このコードでは、大きな数値のリストlargeNumbersに対して、特定の数値が含まれているかどうかをparallelStreamを使って並列処理により検索しています。

これにより、検索処理のパフォーマンスが向上します。

○サンプルコード11:ネストされたコレクションの探索

Groovyでは、ネストされたコレクション(コレクション内にコレクションがある状態)の検索も容易に行えます。

下記のサンプルコードでは、ネストされたリスト内で特定の要素を検索する方法を表しています。

List<List<String>> nestedList = [["apple", "banana"], ["cherry", "date"]]
boolean containsDate = nestedList.any { subList -> subList.contains("date") }
println "ネストされたリストに'date'が含まれているか: $containsDate"

このコードでは、ネストされたリストnestedList内の各サブリストに対してcontainsメソッドを適用し、"date"という要素が含まれているかどうかを確認しています。

このように、ネストされた構造の中でもGroovyの柔軟なコレクション操作により簡単に要素を検索することが可能です。

○サンプルコード12:ファイル内の文字列検索

Groovyの柔軟なファイル処理機能を利用して、ファイル内の特定の文字列を探索することができます。

下記のサンプルコードでは、テキストファイルから特定の文字列を検索する方法を表しています。

File file = new File("example.txt")
String searchText = "Groovy"
boolean found = file.text.contains(searchText)
println "ファイル内に'${searchText}'が含まれているか: $found"

このコードでは、まずFileオブジェクトを作成し、ファイルの内容を読み込んでいます。

その後、containsメソッドを使用してファイル内に特定の文字列が存在するかどうかを確認しています。

○サンプルコード13:データベースクエリの検索条件

Groovyを使用すると、データベースへのクエリ内でcontainsメソッドを利用することが可能です。

下記のサンプルコードは、データベース内の特定のテーブルから条件に合致するレコードを検索する方法を表しています。

def sql = Sql.newInstance("jdbc:mysql://localhost:3306/exampledb", "user", "password")
String searchWord = "Groovy"
sql.eachRow("SELECT * FROM products WHERE description LIKE '%${searchWord}%'") { row ->
    println "製品名: ${row.name}, 説明: ${row.description}"
}

この例では、SQLクエリを使用してdescription列に特定の単語が含まれるレコードを検索しています。

GroovyのStringインターポレーション機能を利用することで、クエリの中で動的に変数を使用することができます。

○サンプルコード14:ウェブサービスの応答データの検索

Webサービスからの応答データを処理する際、Groovyのcontainsメソッドは特に有用です。

下記のサンプルコードは、RESTful Webサービスから受け取ったJSONレスポンス内の特定のキーワードを検索する方法を表しています。

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1')
import groovyx.net.http.RESTClient

def client = new RESTClient('https://api.example.com/')
def response = client.get(path: '/data')

if (response.data.containsKey('key') && response.data.key.contains('Groovy')) {
    println "キーワード'Groovy'が見つかりました"
} else {
    println "キーワード'Groovy'は見つかりませんでした"
}

このコードでは、HTTPビルダーライブラリを利用してRESTful Webサービスからデータを取得し、JSONレスポンスの特定のキーに特定の値が含まれているかをチェックしています。

○サンプルコード15:非同期処理との連携

Groovyの非同期プログラミング機能を使うと、containsメソッドの処理を非同期で実行することができます。

下記のサンプルコードでは、非同期タスクの中で文字列の検索を行う方法を表しています。

import groovy.concurrent.Async

def asyncSearch = Async.start {
    def text = "非同期処理の例"
    return text.contains("非同期")
}

def result = asyncSearch.get()
println "非同期検索の結果: $result"

このコードでは、Async.start メソッドを使用して非同期タスクを作成し、その中で文字列の検索を実行しています。

非同期処理の結果は、getメソッドを使用して取得されます。

●containsメソッドの応用例

Groovyのcontainsメソッドは、プログラミングの多岐にわたる領域で応用可能です。

このメソッドは、データのフィルタリング、検証、さらにはユーザーインターフェイスの動作制御など、さまざまなシナリオで活用できます。

ここでは、それぞれの応用例について具体的なサンプルコードを交えながら解説します。

○応用サンプルコード1:データフィルタリング

データセットから特定の条件を満たす要素を抽出する場合、containsメソッドは非常に有用です。

下記のコードは、文字列のリストから特定のキーワードを含む要素のみをフィルタリングする方法を示しています。

def dataList = ['Groovy入門', 'Javaプログラミング', 'Groovy応用']
def filteredList = dataList.findAll { it.contains('Groovy') }
println filteredList

このコードでは、’Groovy’というキーワードを含む要素のみが新しいリストに含まれます。

○応用サンプルコード2:データ検証

containsメソッドは、入力データの検証にも使用できます。

下記のコードは、ユーザー入力が特定のフォーマットを満たしているかどうかを確認する例です。

def userInput = "user@example.com"
if (userInput.contains('@') && userInput.endsWith('.com')) {
    println "有効なメールアドレスです。"
} else {
    println "無効なメールアドレスです。"
}

このコードでは、メールアドレスが ‘@’ を含み、’.com’ で終わるかどうかをチェックしています。

○応用サンプルコード3:ユーザーインターフェイスの条件反映

Groovyのcontainsメソッドは、ユーザーインターフェイスの動作制御にも役立ちます。

下記の例では、特定のユーザー入力に基づいて、異なるアクションを実行する方法を表しています。

def userInput = "表示設定:リスト"

if (userInput.contains('リスト')) {
    println "リスト表示モードを有効化します。"
} else if (userInput.contains('グリッド')) {
    println "グリッド表示モードを有効化します。"
} else {
    println "不明な入力です。"
}

このコードでは、ユーザーの入力に応じて異なる表示モードを有効化しています。

●注意点と対処法

Groovyのcontainsメソッドを使用する際にはいくつかの注意点があります。

これらの注意点を理解し、適切な対処法を取ることで、より効果的かつ安全にメソッドを使用することができます。

○パフォーマンスに関する注意

containsメソッドは、大規模なデータセットや複雑な条件で使用される場合、パフォーマンスに影響を与える可能性があります。

例えば、非常に大きな文字列やコレクションに対してcontainsを頻繁に呼び出すと、プログラムの実行速度が低下することがあります。

対処法としては、必要なデータのみを処理するように範囲を限定する、またはcontainsメソッドを呼び出す回数を最小限に抑えることが挙げられます。

さらに、Groovyの強力なコレクションAPIを活用して、効率的なデータ処理を行うことも有効です。

○型安全に関する注意

Groovyは動的言語であり、コンパイル時に型の不一致が検出されないことがあります。

そのため、containsメソッドを使用する際には、実行時に型の問題が発生しないように注意が必要です。

例えば、containsメソッドを呼び出すオブジェクトが期待する型でない場合、実行時エラーが発生する可能性があります。

これを防ぐためには、メソッドを呼び出す前にオブジェクトの型をチェックするか、Groovyの@TypeCheckedアノテーションを使用して型安全を強化する方法があります。

○コードの可読性と保守性

Groovyの柔軟性はコードの可読性と保守性に影響を与えることがあります。

特に、複雑な条件を含むcontainsメソッドの使用は、コードの理解を困難にする可能性があります。

この問題に対処するには、コードを簡潔に保ち、条件を明確にすることが重要です。

また、コードの可読性を高めるために、適切なコメントやドキュメントを提供することも有効です。

コードの保守性を高めるためには、単体テストを充実させ、リファクタリングを定期的に行うことが推奨されます。

●カスタマイズ方法

Groovyのcontainsメソッドを使用する上で、カスタマイズは非常に重要な要素です。

カスタマイズを行うことで、特定のニーズに合わせてメソッドの動作を調整することが可能になります。

ここでは、カスタマイズの方法をいくつか紹介します。

○カスタムロジックの組み込み

containsメソッドに独自のロジックを組み込むことで、標準の機能を超えた柔軟な検索が実現可能です。

例えば、特定の条件に基づいて要素を検索するためのカスタム条件を設定することができます。

このようなカスタマイズを行う際には、Groovyのクロージャを利用すると効果的です。

def customContains(list, condition) {
    list.any { element -> 
        // ここにカスタム条件を記述
        condition(element)
    }
}

def sampleList = [1, 2, 3, 4, 5]
def result = customContains(sampleList, { it > 3 }) // 3より大きい要素を検索
println result // true が出力される

このコードでは、カスタムロジックとして「3より大きい要素を検索する」条件を設定しています。クロージャを用いることで、様々な条件を柔軟に設定できます。

○containsメソッドの拡張

Groovyでは、既存のメソッドを拡張する機能が提供されています。

この機能を使用すると、containsメソッドに新たな機能を追加し、より複雑な検索が可能になります。

例えば、特定のオブジェクト型に対してのみ動作するcontainsメソッドのバリエーションを作成することができます。

String.metaClass.containsIgnoreCase = { str ->
    delegate.toLowerCase().contains(str.toLowerCase())
}

def sampleString = "Hello Groovy"
def result = sampleString.containsIgnoreCase("groovy") // 大文字小文字を区別しない検索
println result // true が出力される

このコードでは、Stringクラスに対して大文字小文字を区別しないcontainsメソッドを拡張しています。

まとめ

この記事では、Groovyのcontainsメソッドの使い方とその応用例について詳細に解説しました。

基本的な使用法から高度なカスタマイズ方法まで、多様なサンプルコードを通じて、初心者から上級者までが理解できる内容を紹介しました。

containsメソッドは非常に汎用的で、さまざまな状況でのプログラミングに役立ちます。

この知識を活用して、より効率的かつ効果的なGroovyプログラミングを実現しましょう。