Javaエンジニア養成読本 - 4日目

画像貼り付けなくても、編集方法をはてな記法モードにすればコードが貼れることがわかった。
見たままモードでもその機能あってもいいような気もするけど。

特集2 [マルチコアCPU対応] Java SE 8時代のデータ処理入門

第1章 内部イテレーション事始め

今まで。

import java.util.*;

public class SampleClass {
    public static void main(String... args) {
        List<String> strings = new ArrayList<>(Arrays.asList("a", "b"));
        strings.add("c");

        for (Iterator<String> i = strings.iterator(); i.hasNext();) {
            String s = i.next();
            System.out.println(s);
        }

        for (String s : strings) {
            System.out.println(s);
        }
    }
}

内部イテレーション。処理が多い場合は処理を外に出せるというメリットがあるのかな。
可読性や保守性が上がりそう。

import java.util.*;
import java.util.function.Consumer;

public class SampleClass {
    public static void main(String... args) {
        List<String> strings = new ArrayList<>(Arrays.asList("a", "b"));
        strings.add("c");

        strings.forEach(
            new Consumer<String>() {
                @Override
                public void accept(String s) {
                    System.out.println(s);
                }
            }
        );
    }
}

内部イテレーションで要素を削除

import java.util.*;
import java.util.function.Predicate;

public class SampleClass {
    public static void main(String... args) {
        List<String> strings = new ArrayList<>(
            Arrays.asList("a", "b", "1234567890A")
        );
        strings.add("c");
        strings.add("A0987654321");

        strings.removeIf(
            new Predicate<String>() {
                @Override
                public boolean test(String s) {
                    return s.length() > 10;
                }
            }
        );

        System.out.println(strings);
    }
}

「縦の問題」という言い方は知らなかった。

第2章 「縦の問題」を解決するラムダ式

関数型インターフェイスラムダ式

import java.util.*;

public class SampleClass {
    public static void main(String... args) {
        List<String> strings = new ArrayList<>(Arrays.asList(
            "a", "b", "01234567890", "c", "abcdefghijk"
        ));

        strings.forEach(
            (String s) -> {
                System.out.println(s);
            }
        );

        strings.forEach(
            (s) -> {
                System.out.println(s);
            }
        );

        strings.forEach(
            s -> {
                System.out.println(s);
            }
        );

        strings.forEach(s -> System.out.println(s));

        strings.removeIf(s -> s.length() > 10);
        System.out.println(strings);
    }
}

匿名クラスとラムダ式の違いは、ラムダ式は新たなスコープを作らないということ。
既に宣言された変数と同じ名前の変数を定義できない。

public class SampleClass {
    public static void main(String... args) {
        SampleClass sampleClass = new SampleClass();
        sampleClass.print_anonymous();
        sampleClass.print_lambda();
    }

    void print_anonymous() {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println(this);
            }
        };
        r.run();
    }

    void print_lambda() {
        Runnable r = () -> System.out.println(this);
        r.run();
    }

    public String toString() {
        return "SampleClass#toString";
    }
}

メソッド参照

import java.util.*;

public class SampleClass {
    public static void main(String... args) {
        List<String> strings = Arrays.asList("a", "b", "c");
        strings.forEach(s -> System.out.println(s));
        strings.forEach(System.out::println);
    }
}

コンストラクタ参照はどういう使い方だろうか。

今日の感想

サンプルコードでは、なるほど、と思うのだが、生きたコードではどうなのだろうか、と思う。
どういう場面で効果的に使えるのか?というところがわからない。
何かアプリを作ってみればよいのだろうが、何も思い浮かばない。