4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JavaAdvent Calendar 2020

Day 4

StringUtils#containsAnyメソッドの注意

Last updated at Posted at 2020-05-14

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
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?