LoginSignup
35
37

More than 5 years have passed since last update.

Java 9 Streamに追加された3つの新機能

Last updated at Posted at 2015-10-21

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

35
37
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
35
37