Listから検索条件にマッチするものを取得する
【概要】
今回はListから特定の値を検索して取得すると言う処理を書いてみました。
検索結果が何もなかった場合は特定の初期値を返すものです。
【ソース】
import java.util.ArrayList; import java.util.List; public class StreamTips { private final List<String> valueList = new ArrayList<>(); public StreamTips() { valueList.add("one"); valueList.add("two"); valueList.add("three"); valueList.add("four"); valueList.add("five"); } public String useStreamAPI(final String search) { return valueList .stream() .filter(v -> v.equals(search)) .findFirst() .orElse(""); } public String notUseStreamAPI(final String search) { for (String value : valueList) { if (value.equals(search)) { return search; } } return ""; } }
やってみると非常に簡単です。
filterして、findFirstするだけです。
findFirstの戻り値はOptionalなので、orElseで初期値を設定します。
参考までにStreamAPIを使わないパターンも載せておきました。
【テストコード】
import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; public class StreamTipsTest { private StreamTips sut; @Before public void setUp() { sut = new StreamTips(); } @Test public void getPattern1() { final String searchValue = "one"; assertThat(sut.notUseStreamAPI(searchValue), is(searchValue)); assertThat(sut.useStreamAPI(searchValue), is(searchValue)); } @Test public void getPattern2() { final String searchValue = "five"; assertThat(sut.notUseStreamAPI(searchValue), is(searchValue)); assertThat(sut.useStreamAPI(searchValue), is(searchValue)); } @Test public void notMatched() { final String searchValue = "hoge"; assertThat(sut.notUseStreamAPI(searchValue), is("")); assertThat(sut.useStreamAPI(searchValue), is("")); } }
実行確認と言うことでテストコードです。
【まとめ】
Streamの方が宣言的な記述になりますね。
やりたいことは
「Listから 検索条件に一致するもの のうち最初のもの を取得する。取得できなければ""を返す」
return valueList .stream() // Listから .filter(v -> v.equals(search)) // 検索条件に一致するもの .findFirst() // のうち最初のもの .orElse(""); // を取得する。取得できなければ""を返す
意味の通じるコードになりましたね。