技術とか戦略とか

証券レガシーシステムを8年いじってから転職した普通の文系SEによるブログ。技術のみではなく趣味の戦略考察についても。

java:今さらながらJava8新機能について調べてみた(Stream)

Java8でどのような機能が追加されたのかを確認中です。
今回は「Stream」についてです。
 
Streamを使うことで、for文を使用することなく配列やCollectionなどの集合体を扱うことができるようになります。
出力条件の設定や重複排除、ソート等の操作も、メソッドを一つ付け加えるだけで実現可能です。
また、並列処理用のオブジェクトを使うことで順番を保証しない代わりに処理速度を高めることもできます。
 
「Stream」に関しては以下のページの説明がわかりやすかったです。
 
初心者向け Java8 Stream APIについて知ろう  キャスレーコンサルティング株式会社

https://www.casleyconsulting.co.jp/blog/engineer/191/

 
-------------------
 
for文を使った従来の書き方とStreamを使った書き方を比較したかったので、サンプルコードを書いてみました。
また、前回説明したラムダ式の挙動も確認したかったので、標準出力ではなくファイル出力のサンプルとしています。
 
【サンプルコード】
package lesson1;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Main1 {
    public static void main(String[] args) {
        List<String> lists = Arrays.asList("hoge", "fuga", "piyo");
        try {
            final FileWriter fw1 = new FileWriter("C:\\tmp\\test1.txt");
            final FileWriter fw2 = new FileWriter("C:\\tmp\\test2.txt");
            // 昔の書き方
            for(int i = 0; i < lists.size(); ++i) {
                String str = lists.get(i);
                fw1.write(str+"\r\n");
            }
            fw1.close();
            // Streamを使ってみた
            Stream<String> stream = lists.stream();
            stream.forEach(str -> {
                try {
                    fw2.write(str+"\r\n");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
            fw2.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 
【出力結果】
・test1.txt
hoge
fuga
piyo
 
・Test2.txt
hoge
fuga
piyo
 
【感想】
for文の排除は確認できましたが、Streamとは関係ない所でコードがごちゃごちゃしてしまいました…。
コードがごちゃごちゃした原因は、ラムダ式に以下の仕様があるためです。
(「式」と言いつつ処理的にはクラスを作っているので、考えてみれば当然の仕様ですね…)
 ・ラムダ式の外で定義した変数は変更できない(finalで定義する必要がある)
 ・ラムダ式の中でもIOExceptionの処理を書かなければならない