プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

Java Streamの使い方

■Streamの生成

public class Main {
    public static void main(String[] args) {
        //ListからStreamを取得
        List<String> list = Arrays.asList("orange", "apple", "lemon");
        Stream<String> listStream = list.stream();

        //SetからStreamを取得
        Set<String> set = new HashSet<>();
        Stream<String> setStream = set.stream();

        //MapからStreamを取得
        Map<String, String> map = new HashMap<>();
        Stream<Map.Entry<String, String>> mapStream = map.entrySet().stream();

        //配列からStreamを取得
        String[] array = {"orange", "apple", "lemon"};
        Stream<String> arrayStream = Stream.of(array);

        //固定の要素からStreamを取得
        Stream<String> attributeStream = Stream.of("orange", "apple", "lemon");
    }
}

 
 


■Streamの要素を繰り返す

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("orange", "apple", "lemon");

        //ラムダ式で要素を繰り返す
        list.stream().forEach(e -> System.out.println(e));

        //メソッド参照で要素を繰り返す
        list.stream().forEach(System.out::println);
    }
}

 
 


■Streamの要素をフィルタリング

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("orange", "apple", "lemon");

        //「ora」を含む要素でフィルタリング
        list.stream()
            .filter(e -> e.contains("ora"))
            .forEach(e -> System.out.println(e));
    }
}

 
 


■Streamの要素を変換

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("orange", "apple", "lemon");

        //mapで要素を大文字に変換
        //map()メソッド:引数にStreamの要素を受け取り、変換後の値を返すラムダ式を渡す
        list.stream()
            .map(e -> e.toUpperCase())
            .forEach(System.out::println);

        //flatMapで要素を大文字に変換
        //flatMap()メソッド:引数にラムダ式を渡すとラムダ式が返したStreamの要素が連結されたStreamで返す
        list.stream()
            .flatMap(e -> Stream.of(e.toUpperCase()))
            .forEach(System.out::println);
    }
}

 
 


■Streamをコレクションに変換

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("orange", "apple", "lemon");

        //map()メソッドでラムダ式の結果のStreamを返し、「collect(Collectors.toList())」でListに変換
        List<String> resultList = list.stream()
                                    .map(e -> e.toUpperCase())
                                    .collect(Collectors.toList());
        resultList.stream().forEach(System.out::println);

        //Setに変換
        Set<String> resultSet = list.stream()
                                    .map(e -> e.toUpperCase())
                                    .collect(Collectors.toSet());
        resultSet.stream().forEach(System.out::println);

        //Mapに変換
        Map<String, Integer> resultMap = list.stream()
                                            .collect(Collectors.toMap(
                                                    e -> e,
                                                    e -> e.length()));
        resultMap.entrySet().stream().forEach(System.out::println);
    }
}

 
 


Streamの要素を並列処理

public class Main {
    public static void main(String[] args) {
        //Listの並列処理
        List<String> list = Arrays.asList("orange", "apple", "lemon");

        //「parallelStream()」で並列処理可能なStreamを取得
        list.parallelStream()
            .map(e -> e.toUpperCase())
            .forEach(System.out::println);

        //Streamの並列処理
        IntStream.range(1, 100)
            .parallel() //並列処理可能なStreamを取得
            .filter(e -> e % 2 == 0) //偶数でフィルタリング
            .forEach(System.out::println);
    }
}