Listから検索条件にマッチするものを取得する

【前提条件】

[環境]
[参考資料]

Java8 APIドキュメント
http://docs.oracle.com/javase/jp/8/api/

【概要】

今回は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("");                       // を取得する。取得できなければ""を返す

意味の通じるコードになりましたね。