Java
VSCode
Java9
RossoDay 15

VScodeでjava9新機能(StreamAPIとOptional)を試してみた

環境構築

事前準備

Ctrl+Shift+Xで拡張機能を開き、VScodeに拡張機能をインストール

※下記キャプチャは既にインストール済みのため、インストールボタンは表示されていません。

Language Support for Java(TM) by Red Hat のインストール
vscodejava.PNG

VScodeでjava言語のサポート、キーワード補完等を行ってくれます。

code runner のインストール
vscoderunner.PNG

範囲選択している部分、Ctrl + Alt + NでVScode上でコンパイルして実行してくれます。
VScodeのターミナルを表示しjavacコマンドでコンパイルし、javaコマンドで実行することも可能です。

Ctrl+, でユーザーの設定画面を開き、JDKの設定

java.homeにjdkのパスを設定し保存、再起動
vscodesetting.PNG

Java9(StreamAPIとOptional)の実行

StreamAPI

VScodeで実行
stream.PNG

①takeWhileメソッド
特定の条件に一致している間のデータを対象とし処理する。

List<String> list = Arrays.asList("apple", "banana", "orange", "strawberry", "grape");
list.stream().takeWhile(fluit -> fluit.length() < 7).forEach(System.out::println);

[実行結果]
apple
banana
orange

②dropWhileメソッド
特定の条件に一致している間のデータを対象外としそれ以降のデータを対象とし処理する。

List<String> list = Arrays.asList("apple", "banana", "orange", "strawberry", "grape");
list.stream().dropWhile(fluit -> fluit.length() < 7).forEach(System.out::println);

[実行結果]
strawberry
grape

③ofNullableメソッド
対象のデータがnullでない場合は、Streamを返却。nullの場合は、空のStreamを返却する。

List<String> list = Arrays.asList("apple", "banana", "orange", "strawberry", "grape");
Map<String, String> map = new HashMap<String, String>();
    map.put("apple", "りんご");
    map.put("banana", "ぶどう");
list.stream().flatMap(str -> Stream.ofNullable(map.get(str))).forEach(System.out::println);

[実行結果]
りんご
ぶどう

StreamAPIまとめ

    List<String> list = Arrays.asList("apple", "banana", "orange", "strawberry", "grape");

    // takeWhileメソッド
    // 特定の条件に一致している間のデータを対象とし処理する
    list.stream().takeWhile(fluit -> fluit.length() < 7).forEach(System.out::println);

    // dropWhileメソッド
    // 特定の条件に一致している間のデータを対象外としそれ以降のデータを対象とし処理する
    list.stream().dropWhile(fluit -> fluit.length() < 7).forEach(System.out::println);

    Map<String, String> map = new HashMap<String, String>();
    map.put("apple", "りんご");
    map.put("banana", "ぶどう");
    // ofNullableメソッド
    // 対象のデータがnullでない場合は、Streamを返却。nullの場合は、空のStreamを返却
    list.stream().flatMap(str -> Stream.ofNullable(map.get(str))).forEach(System.out::println);

Optional

VScodeで実行
optional.PNG

①ifPresentOrElseメソッド
データが存在する場合はConsumer型の第一引数のactionが実行、存在しない場合はRunnable型の第二引数のemptyActionが実行される

Optional<String> optStr = Optional.ofNullable("tennis");
optStr.ifPresentOrElse(s -> System.out.println("data is " + s), () -> System.out.println("error"));

[実行結果]
data is tennis

②streamメソッド
flatMapメソッドの引数にOptional::streamを渡すことで、optionalで包まれているコレクションからnullでないデータを取得することが可能

List<Optional<String>> optlist = new ArrayList<>();
optlist.add(Optional.of("sports"));
optlist.add(Optional.empty());
optlist.stream().flatMap(Optional::stream).collect(Collectors.toList()).forEach(System.out::println);

[実行結果]
sports

③orメソッド
Optionalで値がラップされたまま後続の処理をしていくことが可能

Optional<String> base = Optional.ofNullable(null);
Optional<String> data = base.or(() -> Optional.of("Empty"));
System.out.println(data);

[実行結果]
Optional[Empty]

Optionalまとめ

    // ifPresentOrElseメソッド
    // データが存在する場合はConsumer型の第一引数のactionが実行、存在しない場合はRunnable型の第二引数のemptyActionが実行される
    Optional<String> optStr = Optional.ofNullable("tennis");
    optStr.ifPresentOrElse(s -> System.out.println("data is " + s), () -> System.out.println("error"));

    List<Optional<String>> optlist = new ArrayList<>();
    optlist.add(Optional.of("sports"));
    optlist.add(Optional.empty());
    // streamメソッド
    // flatMapメソッドの引数にOptional::streamを渡すことで、optionalで包まれているコレクションからnullでないデータを取得することが可能
    optlist.stream().flatMap(Optional::stream).collect(Collectors.toList()).forEach(System.out::println);

    // orメソッド
    // Optionalで値がラップされたまま後続の処理をしていくことが可能
    Optional<String> base = Optional.ofNullable(null);
    Optional<String> data = base.or(() -> Optional.of("Empty"));
    System.out.println(data);

参考資料

http://www.casleyconsulting.co.jp/blog-engineer/java/java9%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BDstream%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%82/
https://blogs.msdn.microsoft.com/ayatokura/2016/07/05/vscode_java/