More than 1 year has passed since last update.

Java 9 Stream 新機能

 
 JDK9 build b83 (以下 Java 9) の Stream に追加された「全」3 個の新機能を使ってみました。

機能 Java 8 Java 9 (build b83) JavaDoc
条件を満たす間のデータを対象外とする n/a dropWhile Stream dropWhile(Predicate<? super T> predicate)
条件を満たす間のデータを対象とする n/a takeWhile Stream takeWhile(Predicate<? super T> predicate)
Null 許容 n/a ofNullable static Stream ofNullable(T t)

dropWhile

メリット

 Java 8 では,リストの先頭から条件を満たす間のデータを対象外にしたい場合はデータをスキップさせる泥臭い処理が必要でした。

 Java 9 では,対象外にしたいデータの条件を dropWhile に設定するだけで,対象外にしたいデータを簡単にスキップすることができるようになりました。

Java 8

// arrange
List<Integer> list = Arrays.asList(0, 1, 2, -1, 2);

// act
Predicate<Integer> p = (x) -> x <= 1;

boolean isDirty = false;
for (Integer x : list) {
    if (!isDirty && p.negate().test(x)) isDirty = true;
    if (isDirty) System.out.println(x);
}
// 2
// -1
// 2

long skipIndex = list.indexOf(list.stream().filter(p.negate()).findFirst().get());
list.stream().skip(skipIndex).forEach(System.out::println);
// 2
// -1
// 2

Java 9

// arrange
List<Integer> list = Arrays.asList(0, 1, 2, -1, 2);

// act
list.stream().dropWhile(x -> x <= 1).forEach(System.out::println);
// 2
// -1
// 2

他の言語

言語 Java 9 dropWhile
Haskell dropWhile
Scala dropWhile
Python dropWhile
Ruby drop_while
C# SkipWhile

takeWhile

メリット

 Java 8 では,リストの先頭から条件を満たす間のデータを対象にしたい場合,条件を満たさないデータをスキップする処理が必要でした。

 Java 9 では,対象にしたいデータの条件を takeWhile に設定するだけで,必要なデータを簡単に処理できるようになりました。

Java 8

// arrange
List<Integer> list = Arrays.asList(0, 1, 2, -1, 2);

// act
for (Integer x : list) {
    if (x <= 1) System.out.println(x);
    else break;
}
// 0
// 1

Java 9

// arrange
List<Integer> list = Arrays.asList(0, 1, 2, -1, 2);

// act
list.stream().takeWhile(x -> x <= 1).forEach(System.out::println);
// 0
// 1

他の言語

言語 Java 9 takeWhile
Haskell takeWhile
Scala takeWhile
Python takeWhile
Ruby take_while
C# TakeWhile

ofNullable

メリット

 Java 8 では,以下のコードのような場合に null 判定が必要でした。

 Java 9 では,null を含む可能性がある処理に ofNullable を適用することで,null 判定が不要となりました。

Java 8

// arrange
List<String> list = Arrays.asList("Angular", "ES7", "React");
Map<String, Integer> map = new HashMap<String, Integer>() {
    {
        put("Angular", 1);
        put("ES2016", 2);
        put("React", 3);
    }
};

// act
list.stream().flatMap(str -> {
    Integer temp = map.get(str);
    return (temp != null) ? Stream.of(temp) : Stream.empty();
}).forEach(System.out::println);
// 1
// 3

Java 9

// arrange
List<String> list = Arrays.asList("Angular", "ES7", "React");
Map<String, Integer> map = new HashMap<String, Integer>() {
    {
        put("Angular", 1);
        put("ES2016", 2);
        put("React", 3);
    }
};

// act
list.stream().flatMap(str -> Stream.ofNullable(map.get(str))).forEach(System.out::println);
// 1
// 3

結論

 
 Java 9 (JDK9 build b83) Stream に追加された機能は僅か3つです。(2015/10/22現在)
 Stream は進化を止めたのでしょうか?
 Stream にはまだまだ必要な機能があります。
 zip,intersect(積集合),union(和集合),except(差集合)など…
 
 
 
 
 
 

 …僕の jLinqer にはzip も intersect もあります (/ω・\)チラッ

付録

Java 9 環境構築

# 手順 操作 図 
1 JDK9 をダウンロード JDK 9 Early Access with Project Jigsaw, build b83 jdk9_download.png
2 IntelliJ をダウンロード IntelliJ IDEA Community Edition intellij_download.png
3 IntelliJ SDK 設定 1 File > Project Structure > SDKs > + > JDK > "JDK9を解凍したフォルダ" を選択 intellij_sdk1.png
4 IntelliJ SDK 設定 2 File > Project Structure > Project > Project SDK > "1.9" を選択 intellij_sdk2-3.png
5 IntelliJ SDK 設定 3 File > Project Structure > Project > Project Language Level > "9 - JDK modularization etc." X - Experimental features を選択
6 IntelliJ SDK 設定 4 File > Project Structure > Project > Modules > Sources > "9 - JDK modularization etc." X - Experimental features を選択 intellij_sdk4.png

Java 9 Stream ソースコード サンプル

 
 GitHub にサンプルをアップしました。
  GitHub, j9Stream, https://github.com/k--kato/j9Stream

IntelliJ Java 9 のコンパイルエラー

 
 以下の IntelliJ コンパイルエラーは未解決です。
 Maven を使って compile & test を実施しています。

Error:Abnormal build process termination: 
エラー: メインクラスorg.jetbrains.jps.cmdline.Launcherが見つからなかったかロードできませんでした
Error:java: invalid flag: -release

 X - Experimental features を選択するとコンパイルが可能となります。

参考文献

[1] Java8, "Interface Stream", http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
[2] Java9, "Interface Stream", http://download.java.net/java/jigsaw/docs/api/java/util/stream/Stream.html
[3] Java.net JDK 9 Project, "JDK 9 Early Access with Project Jigsaw, build b83", https://jdk9.java.net/jigsaw/
[4] Paul Sandoz, "JDK Bug System JDK-8050819 Please add java.util.Stream.ofNullable(T object)", https://bugs.openjdk.java.net/browse/JDK-8050819
[5] guava-libraries, "Guava: Google Core Libraries for Java 1.6+", https://code.google.com/p/guava-libraries/issues/detail?id=619
[6] Stackoverflow, "How to start a new JavaFX project with JDK 9 in IntelliJ", http://stackoverflow.com/questions/39458945/how-to-start-a-new-javafx-project-with-jdk-9-in-intellij

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.