- 投稿日:2020-05-15T22:09:00+09:00
Listのメソッド
Listのメソッドについてまとめていきます。
随時更新していく予定です。add(E e)
指定された要素をこのリストの最後に追加します。
List<String> list = new ArrayList<>(); list.add("あいう"); list.add("えお"); list.add("asdf"); System.out.println(list);[あいう, えお, asdf]add(int index, E element)
リスト内の指定された位置に、指定された要素を挿入します。
List<String> list = new ArrayList<>(); list.add("あいう"); list.add("えお"); //0番目に挿入する list.add(0, "ABCD"); list.add("asdf"); System.out.println(list);[ABCD, あいう, えお, asdf]clear()
すべての要素をこのリストから削除します。
List<String> list = new ArrayList<>(); list.add("あいう"); list.add("えお"); list.add(0, "ABCD"); list.add("asdf"); System.out.println(list); list.clear(); System.out.println(list);[ABCD, あいう, えお, asdf] []contains(Object o)
指定の要素がこのリストに含まれている場合にtrueを返します。
List<String> list = new ArrayList<>(); list.add("あいう"); list.add("えお"); list.add(0, "ABCD"); list.add("asdf"); //"asdf"はlistに含まれているので、true System.out.println(list.contains("asdf")); //"a"はlistに含まれていないので、false System.out.println(list.contains("a"));true falsecontainsAll(Collection<?> c)
指定されたコレクションのすべての要素がこのリストに含まれている場合にtrueを返します。
List<String> list = new ArrayList<>(); List<String> list3 = new ArrayList<>(); List<String> list4 = new ArrayList<>(); list.add("あい"); list.add("うえ"); list.add(0, "AB"); list3.add("あい"); list3.add("うえ"); list3.add(0, "AB"); list4.add("あい"); list4.add("う"); list4.add(0, "AB"); //listとlist3の含まれている要素が同じなので、true System.out.println(list.containsAll(list3)); //listとlist4の含まれている要素が相違しているので、false System.out.println(list.containsAll(list4));true falseequals(Object o)
指定されたオブジェクトがこのリストと等しいかどうかを比較します。
List<String> list = new ArrayList<>(); List<String> list3 = new ArrayList<>(); List<String> list4 = new ArrayList<>(); list.add("あい"); list.add("うえ"); list.add(0, "AB"); list3.add("あい"); list3.add("うえ"); list3.add(0, "AB"); list4.add("あい"); list4.add("う"); list4.add(0, "AB"); System.out.println(list.equals(list3)); System.out.println(list.equals(list4));true falseget(int index)
このリスト内の指定された位置にある要素を返します。
List<String> list = new ArrayList<>(); list.add("あい"); list.add("うえ"); list.add(0, "AB"); System.out.println(list.get(1)); System.out.println(list.get(2)); //IndexOutOfBoundsException System.out.println(list.get(3));あい うえ IndexOutOfBoundsExceptionhashCode()
このリストのハッシュ・コード値を返します。
List<String> list = new ArrayList<>(); list.add("あい"); list.add("うえ"); list.add(0, "AB"); System.out.println(list.hashCode());14680320
indexOf(Object o)
指定された要素がこのリスト内で最初に検出された位置のインデックスを返します。指定された要素がこのリストにない場合は -1を返します。
List<String> list = new ArrayList<>(); list.add("あい"); list.add("うえ"); list.add(0, "AB"); System.out.println(list.indexOf("あい")); System.out.println(list.indexOf("AB")); System.out.println(list.indexOf("q"));1 0 -1isEmpty()
このリストに要素がない場合にtrueを返します。
List<String> list = new ArrayList<>(); List<String> list3 = new ArrayList<>(); List<String> list4 = new ArrayList<>(); list.add("あい"); list.add("うえ"); list.add(0, "AB"); list3.add(""); //要素があるので、false System.out.println(list.isEmpty()); //要素にブランクが入っているので、false System.out.println(list3.isEmpty()); //要素がないので、true System.out.println(list4.isEmpty());false false truelastIndexOf(Object o)
指定された要素がこのリスト内で最後に検出された位置のインデックスを返します。指定された要素がこのリストにない場合は -1を返します。
List<String> list = new ArrayList<>(); list.add("あい"); list.add("あい"); list.add("うえ"); //検出される最後の位置が1 System.out.println(list.lastIndexOf("あい")); //"あ"は存在しないので、-1 System.out.println(list.lastIndexOf("あ"));1 -1remove(int index)
このリスト内の指定された位置にある要素を削除します。
List<String> list = new ArrayList<>(); list.add("あい"); list.add("あい"); list.add("うえ"); System.out.println(list); System.out.println(list.remove(1)); System.out.println(list);[あい, あい, うえ] あい [あい, うえ]remove(Object o)
指定された要素がこのリストにあれば、その最初のものをリストから削除します。
List<String> list = new ArrayList<>(); list.add("あい"); list.add("あい"); list.add("うえ"); System.out.println(list); //文字を指定しても削除可能 list.remove("あい"); System.out.println(list);[あい, あい, うえ] [あい, うえ]removeAll(Collection<?> c)
このリストから、指定されたコレクションに含まれる要素をすべて削除します。
List<String> list = new ArrayList<>(); list.add("あい"); list.add("あい"); list.add("うえ"); System.out.println(list); list.removeAll(list); System.out.println(list);[あい, あい, うえ] []retainAll(Collection<?> c)
このリスト内で、指定されたコレクションに含まれている要素だけを保持します。
※指定されたコレクションに含まれていないすべての要素をこのリストから削除します。
List<String> list = new ArrayList<>(Arrays.asList("Apple","Orange", "Melon")); List<String> list3 = new ArrayList<>(Arrays.asList("Orange","Melon")); //listにlist3と同じ要素が含まれているもののみ保持 list.retainAll(list3); System.out.println(list);[Orange, Melon]set(int index, E element)
このリスト内の指定された位置にある要素を、指定された要素に置き換えます。
List<String> list = new ArrayList<>(Arrays.asList("Apple","Orange", "Melon")); //0番目の"Apple"と"Banana"を入れ替える list.set(0, "Banana"); System.out.println(list);[Banana, Orange, Melon]size()
このリスト内にある要素の数を返します。
List<String> list = new ArrayList<>(Arrays.asList("Apple","Orange", "Melon")); System.out.println(list.size()); list.add("Banana"); //直前にaddしているので、要素数が増加 System.out.println(list.size());3 4subList(int fromIndex, int toIndex)
このリストの、指定されたfromIndex (これを含む)からtoIndex (これを含まない)までの部分のビューを返します。
ArrayList<Integer> foo = new ArrayList<>(Arrays.asList(10, 30, 5, 1, 11, 90)); System.out.println(foo.subList(0, 3)); System.out.println(foo.subList(1, 2)); System.out.println(foo.subList(4, 5));[10, 30, 5] [30] [11]toArray(T[] a)
このリスト内のすべての要素を適切な順序で(最初の要素から最後の要素へ)含んでいる配列を返します。
リストから配列に変換するには、toArrayメソッドを利用します。List<String> list = new ArrayList<>(Arrays.asList("Apple","Orange", "Melon")); String[] str = new String[list.size()]; list.toArray(str); System.out.println(Arrays.toString(str)); System.out.println(list);[Apple, Orange, Melon] [Apple, Orange, Melon]
- 投稿日:2020-05-15T19:16:57+09:00
【Javaの基礎知識】型変換について
はじめに
こちらの記事は、
- Javaをこれから学習し始める
- 基本的なことをおさらいしたいという方向けです。
型や変数については下記の記事に記載しております。
【Javaの基礎知識】型や変数について基本型(プリミティブ型)の変換
ある基本型の変数から他の基本型の変数に変換す方法をご紹介します。
変換元の基本型 型変換が可能な変更先の基本型 char int, long, float, double byte short, int, long, float, double short int, long, float, double int long, float, double long float, double float double double なし 小さい型から大きい型
整数のデータ型は、
byte < short < int < long
というサイズ感です。
小さい型から大きい型に変換するとき、自動的に型が変換される場合と、プログラマが意識的に変換を行うキャストがあります。自動的に型が変換される場合 byte a = 127; short b = a; System.out.println(b);//出力結果=127 short c = 32767; long d = c; System.out.println(d);//出力結果=32767プログラマが意識的に変換を行うキャスト byte a = 127; byte b = 127; System.out.println((long)a + b);//出力結果=254 int c = 2147483647; int d = 2147483647; System.out.println((long)c + d);//出力結果=4294967294大きい型から小さい型
大きい型から小さい型への変換は注意が必要です。
以下のやり方だとエラーがでます。
long a = Long.MAX_VALUE;//longの最大値を代入しています System.out.println(a);//出力結果=9223372036854775807 short b = a;//Type mismatch: cannot convert from long to shortエラーを直す方法はありますが、変数の中身が変わってしまいます。
そのデータ型が持つことのできるサイズを超えるとデータの切り捨て(データの溢れ)が生じ、想定された実行結果になりません。long a = Long.MAX_VALUE;//longの最大値を代入しています System.out.println(a);//出力結果=9223372036854775807 short b = (short) a;//キャストで型変換しています System.out.println(b);//出力結果=-1参照型の変換
今回は、クラス型の型変換のみの説明になります。
変換元の参照型がクラス型の場合の変換先の参照型と、型変換のルールが下図の通りです。
変換先の参照型 型変換のルール クラス型 変換先のクラス型が変換元のクラス型のスーパークラスであること。 インタフェース型 変換先のインタフェース型のインタフェースを変換元のクラス型のクラスが実装していること。 配列型 型変換不可。
参照型暗黙の型変換
親クラス型 変数 = new 子クラス();//親クラス class Oya { void greet() { String a = "おはよう"; System.out.println(a); } } //親クラスを継承した子クラス class Kodomo extends Oya { void name() { String b = "イニエスタ"; System.out.println(b); } public static void main(String[] args) { Oya oy = new Kodomo(); oy.greet();//出力結果=おはよう Oya oy2 = new Oya(); oy2.greet();//出力結果=おはよう Kodomo ko = new Kodomo(); ko.greet();//出力結果=おはよう ko.name();//出力結果=イニエスタ Kodomo ko2 = new Oya();//エラー:Type mismatch: cannot convert from Oya to Kodomo } }エラーが出ているところにあるように、
子クラス型 変数 = new 親クラス();
はできません。文字列への変換
全ての型から文字型へ変換が可能です。
Integer a1 = 123; String s1 = "あ" + a1; System.out.println(s1);//出力結果=あ123 System.out.println(s1 instanceof String);//出力結果=true int a2 = -123; String s2 = String.valueOf(a2); System.out.println(s2);//出力結果=-123 System.out.println(s2 instanceof String);//出力結果=true最後に
参照型の変換に関してまだまだ深くは理解できていないので、
わかり次第追記していく予定です。それでは、ありがとうございました☕️
- 投稿日:2020-05-15T17:23:11+09:00
コードを書く上で使えそうなJava14新機能
Java14
2020/3/17にJava14がリリースされました。
Java14で追加された機能のうち、コードを書く上で使えそうな機能を紹介してみようと思います。record(preview)
データ保持用のクラスが簡単に作ることができる。
public record Customer(String name, String age){}以下のクラスと同等のものが作成される。
public class Customer { private final String name; private final String age; public Customer(String name, String age) { this.name = name; this.age = age; } public String name() { return this.name; } public String age() { return this.age; } public String hashCode() {...} public boolean equals() {...} public String toString() {...} }値設定用のメソッドは定義されないため、インスタンス生成後に値を変更することはできない。
テキストブロック
改行を含んだ文字列を定義することができるようになった。
"ではなく"""で文字列を囲むとテキストブロックとして認識する。String str1 = "aaaa\n" + "bbb"; String str2 = """ aaa bbb\ """上記2つの文字列は同じことを示します。
改行をしたくない場合は場合は\を入れる。Helpful NullPointerExceptions
NullPointerExceptionが発生した際のメッセージが詳細に出せるようになった。
String str = null; str.length(); // NullPointerExceptionデフォルトでは以下のような例外が出力される。
Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:5)java14では「-XX:+ShowCodeDetailsInExceptionMessages」をつけて実行すると、以下のような詳細な例外が出力されるようになる。
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "<local1>" is null at Test.main(Test.java:5)パターンマッチングinstanceof(preview)
instanceofで型のチェックをしつつ、その型の変数を定義できるようになった。
Object obj = "obj"; if (obj instanceof String str){ System.out.println(str.length()); }
- 投稿日:2020-05-15T13:33:15+09:00
IDE(eclipse)のデバッグ実行、ステップ実行(Java)
はじめに
この記事は現在Javaを勉強する方に向けた私自身の理解している内容の記録です。
統合開発環境でJavaのコードをデバッグ実行し、ステップ実行で動作確認することが多いので、その一連の流れを記載しようと思います。
Eclipseをインストール
Javaの統合開発環境で今時点で無料で使えるeclipseをインストールしましょう。下記リンクでダウンロードできます。
今時点での最新版のeclipse 2020を選択。
すると下記画像の画面が出てきます。今回は私の環境に合わせてインストールしていきます。Macで64bitCPUであり、Javaの環境が必要なので、下記赤枠を選択します。
ダウンロードページに遷移され、自動でダウンロードが始まります。ダウンロードができたらファイルを開き、アプリケーションに移しましょう。
デバッグ実行用のクラス作成
これでMacにインストールできました。早速起動しましょう。すると画像のような画面が表示されるので、Javaプロジェクトの作成を選択します。
作成を選択すると、画像の画面が出てきます。今回はJavaファイルを動かしてデバッグ実行したいので、プロジェクト名だけ入力して完了します。
完了したらプロジェクトが作成されるので、プロジェクト内にクラスを作りましょう。右クリックで新規、クラスを選択して作成画面が表示されます。
作成画面が表示されたら、名前をMainにし、public static void main(String args[]) にチェックを入れて完了にします。
これでクラスが作成できたので、下記のコードをeclipseのエディタに入力します。
public class Main{ int instans = 60; static int global = 95; static void debug(){ System.out.println("デバッグ実行"); } void print(){ System.out.println("print()"); } public static void main(String args[]){ Main.debug(); System.out.println("main start"); int x = 50; String str = "文字型"; Main m = new Main(); x = 100; str = "文字型変換"; m.print(); System.out.println("main end"); } }このコードをデバッグ実行し、どのように動いているのかを確認していきます。
ブレークポイント
ここからデバッグ実行に入りますが、デバッグ実行を行うには、プログラムを止める場所を先に指定する必要があります。それをブレークポイントと言います。実際にeclipseでブレークポイントの設定をしましょう。
System.out.println("main start");今回は上記の箇所にブレークポイントを設定します。eclipseエディタの上記コードの行数の左側を右クリックし、メニューを表示してブレークポイントの切り替えを選択します。
この設定でデバッグ実行ができるので、eclipseの左上の虫マークを選択します。ここでデバッグ実行が始まります。
これでデバッグ機能が立ち上がります。そして先ほど設定したブレークポイントで処理が止まっています。
そのため、ブレークポイント前に動作する「デバッグ実行」の出力は出ており、下のf「main end」は出力されていません。
よって、2つの処理の間に置いているブレークポイントで処理が止まっているのがわかります。ステップ実行
ここまでは処理を止めるところまでですが、処理を1行ずつ進めるステップ実行を行なってみましょう。上記の続きでステップオーバーボタンをクリックします。
クリック後は止まっている処理が1行実行され、選択状態が次の行に映ります。ブレークポイントを
System.out.println("main start");にしていて、ステップ実行で1行実行されたので、出力欄にmain startが表示されています。
1行ずつ動いているステップ実行のイメージができたと思うので、さらにステップオーバーボタンを2回押して進めてみましょう。
エディタの右側に変数のリストがありますが、内容が更新されています。2回ステップ実行を行なったことで、変数の定義と初期化を行なっています。
int x = 50; String str = "文字型";この2つの処理が通ることにより、変数の今時点で保持している値が表示できます。さらにステップオーバーボタンを3回クリックして進めてみましょう。
3回ステップ実行を行い、変数xとstrの値が更新される処理があります。
x = 100; str = "文字型変換";そのため変数リストの今時点での値が更新されています。
ちなみに間の処理で変数mを定義しており、生成したインスタンスを代入しています。
Main m = new Main();Mainクラスはインスタンス変数instansがあるので、こちらも定義されているのを確認できます。
変数リストの変数名mの右矢印をクリックしましょう。このようにインスタンス変数も確認できます。
ちなみにstatic変数が表示されないのは、static変数が独立した要素であり、変数mが持っているのではないので表示はされません。終わりに
この記事ではIDEでのデバッグ実行を行い、その中で重要なステップ実行で1行ずつ動作確認する手順を記載しました。
実行中でプログラムが見ている時点での値の状態がわかるので、動作確認をするときに、任意のタイミングで自分の意図した値が入っているかを確認することができるので、デバッグ実行を取り入れてみてはいかがでしょうか。
- 投稿日:2020-05-15T13:24:43+09:00
Javaと.NETの特性を比較してみた
前説
この記事を書く意図はJavaと
.NET
を比較することで技術の優劣をつけることではありません。
エンジニア界隈では言語対して、往々にして宗教戦争があります。Javaのエンジニアは.NET
がWindowsしか乗らないとディスったり、.NET
のエンジニアはJavaは書き方がうるさいと愚痴ったりします。そういう争いは生産性がなく、無意義と考えています。この記事を書くことで双方の言語体系、Webフレームワーク、デプロイ方法を比較することで片方しか経験していないエンジニアがもう片方の技術特性を理解に役立てれば幸いです。
開発ツール
工、その事をよくせんと欲せば、必ずその器を利とす。(職人が立派な仕事をしたいと思ったらまず道具を研ぐ)。
まずは開発に欠かせないツールについて説明します。
フレームワーク ツール 解説 .NET
Visual Studio, Visual Studio Code, Rider Microsoftの公式IDEのVisual Studioは .NET
の全プラットフォームに対応できる。Java Intellij, Eclipse, Visual Studio Code コードの実行とデバッグの役割、JDKに依存する Java Mavan, Gradle テンプレート管理、パッケージングの役割。JDKに依存する Java JDK コンパイルと実行(Runtime)の役割を持つ
.NET
はVisual Studio(以後VSと略す)をインストールすれば開発に着手できる。JavaはIDEだけインストールしては駄目で、JDKやMavenをインストールして設定しなければいけない。JDKとMavenを自動的にインストールしてくれるIDE(Intellij)あるが、なるべく自分でインストールして設定したほうが良い。そうじゃないと意味のわからない地雷を踏むことになる。環境構築の手軽さだけで言うなら
.NET
に軍配が上がる。頭を使わず次へ次へとポチポチすればいい。Javaはまずはツールの特性と責務を理解して設定する必要がある。初心者にとってJavaの最初の関門を少し狭く感じるかもしれません。しかし、Javaは環境構築に苦労するぶん、プロジェクトの仔細がわかるようになる。
まぁ、どちらもVisual Studio Code(以後Vscodeと略す)を使って開発できるので、技術を体系的に理解する目的なら環境構築はVscodeを推奨する。
次に各種ツールをもう少し詳細的に説明します。
責務 .NET
Java 解説 プロジェクト管理 VS,Vscode,Rider Intellij, Eclipse, Vscode Vscode使ってるぶん大差ない、課金してIdeaやRiderを買ったほうが少し効率上がる。Eclipseは ゴミテンプレート管理 IDE+MSBuild or IDE+SDK IDE+Maven or IDE+Gradle .NET
プロジェクトはsln+csprojファイルで構成される。Javaはpom.xmlファイルで構成される。コンパイル・デバッグ IDE+MSBuild+SDK or IDE+SDK IDE+Maven+SDK or IDE+Gradle+SDK .NET
コンパイラは独立してる。 JavaのコンパイラはJDKに統合されており、Mavenプロジェクトはpom.xmlで構成されているが、コンパイラはpom.xmlを認識しないため、コンパイルするにはMavenが必要パッケージ管理 Nuget Mavan, Gradle Nugetは簡単。JavaのMavanやGradleは柔軟で強力。 パッケージング・デプロイ IDE+MSBuild+SDK or IDE+SDK IDE+Maven+SDK or IDE+Gradle+SDK .NET
コンパイラは独立してる。 JavaのコンパイラはJDKに統合されており、Mavenプロジェクトはpom.xmlで構成されているが、コンパイラはpom.xmlを認識しないため、パッケージするにはMavenが必要。
.NET
のSDKが提供されてくれる豊富なテンプレートは簡単で使いやすい。JavaのMavenは柔軟で強力だが、複数プロジェクト管理は.NET
より不便に感じる。この差はコンパイラとテンプレートから来てる。
Javaプロジェクトには公式な標準テンプレートがないため、IDEはプロジェクトのフォルダ整理くらいしかしてくれません。そのぶん自分で任意のディレクトリをSourceRootやResourceRootに決めたりでき、非常に柔軟性に優れています。しかし、柔軟がゆえにチーム開発においてプロジェクト管理の負担が増えるデメリットにもなる。まぁ、MavenやGradleのおかげでJavaのカオス時代は終焉しました。
言語の特性
分類 .NET
Java クラス構成 namespace : 命名空間と実際のディレクトリ構成と一致しなくても構わない Package : 命名空間とディレクトリは一致せなばならん クラス csファイル : クラス名とファイル名は一致しなくてもOK javaファイル : クラス名とファイル名は一致しなくてもOK、だたし、1つのクラスで定義できるpublicクラスは1つのみ コンパイル出力 .dll
,.exe
ファイル.jar
,.war
ファイルWebフレームワーク
.NET
のWebフレームワークはMicrosoft公式のものがデファクトスタンダードです。Javaは公式のServlet APIあるが、デファクトスタンダードはSpringです。MVCフレームワークで比較して行きたいと思います。
機能 .NET
Java 解説 コア機能 ASP.NET
Servlet MVCフレームワーク ASP.NET MVC
Spring MVC テンプレートエンジン Razor Thymeleaf Razorは直感的で使いやすい、Springはテンプレートエンジンの提供がなく、MavenからThymeleafを入れられる データ永続層 Entity Framework Hibernate or MyBatis EFは簡単で習得しやすい。JavaのHibernateは簡単だけど癖がある、 MyBatisはゴリゴリSQL書く必要がある。
.NET
のWebフレームワークは最初からテンプレートエンジンやデータ永続層を提供してくれるので理解しやすく習得が早い。JavaのWebフレームワークはテンプレートエンジンとデータ永続層は選択肢が豊富でプロジェクトの特性に合わせて柔軟に構成できます。Javaのデータ永続層に関して欧米ではHibernateが人気、アジア圏はMyBatisの使用者が多い。(※Googleドレンド調べ)個人的にデータ永続層なら
.NET
のEntity FrameworkはHibernateとMyBatisのいいとこ取りして、使ってて心地よい。デプロイ
.NET Core
のおかげで.NET
はやっとWindowsのみの呪縛から開放され、選択肢が増えて非常に喜ばしい。正直、デプロイに関してはもはや.NET
もJavaも大差ない。
責務 .NET
Java OS Window, Linux Windows, Linux Webサーバー IIS, Kestrel Tomcat IISはGUIなので簡単にデプロイできるが、Windowsでしか使えない難点がある。
まとめ
Javaも
.NET
も各々の良さがあり、優劣をつけられるものではありません。フレームワークは所詮手段に過ぎず、両方のフレームワークの特性を理解することで目的を達成するための最適な選択ができるようになります。
しかし、生態圏でいうとJavaのほうが圧倒的に有利です。コミッターの数も
.NET
の比ではない。
私は.NET
畑出身なので、どうしても.NET
に愛着がわきます。でも、仮に「新人にNET
とJavaどっち勉強したほうがいい?」って聞かれたら、「Windowsに拘らなければJavaのほうがいいよ」とJavaを勧めます。結局技術は一時的なものでで、生態圏は永遠です。PHPが未だに現役なのもこのためです。
- 投稿日:2020-05-15T00:14:38+09:00
StringUtils#containsAnyメソッドの注意
org.apache.commons.lang3.StringUtils
クラスのcontainsAny
はオーバーロードされたいくつかのメソッドがあるが、ハマりやすい挙動があるため注意。第2引数が
CharSequence
のpublic static boolean containsAny(final CharSequence cs, final CharSequence searchChars)の方のメソッドは、第2引数の文字列に含まれるいずれかの
文字
が含まれていた場合にtrueとなる。// 例 StringUtils.containsAny("abcde", "aaa"); // true StringUtils.containsAny("abcde", "efghi"); // true第2引数が
CharSequence...
のpublic static boolean containsAny(final CharSequence cs, final CharSequence... searchCharSequences)の方のメソッドは、第2引数の文字列配列に含まれるいずれかの
文字列
が含まれていた場合にtrueとなる。(今回は、こちらが想定していた挙動)// 例 StringUtils.containsAny("abcde", "aaa", "bbb", "ccc"); // false StringUtils.containsAny("abcde", "cde", "def", "efg"); // true可変引数のメソッドなのに、引数の数が
1
のときだけ挙動が変わるメソッド(のように見える)のため、これからバリエーション増えそうだからStringUtils.contains()
じゃなくてStringUtils.containsAny()
にしとこうという安易な考えでハマらないように注意。以下のように無理やりキャストすることで、可変引数のメソッドの方を呼び出すようにできる。
StringUtils.containsAny("abcde", new String[]{"aaa"}); // false StringUtils.containsAny("abcde", new String[]{"efghi"}); // false