package answers.section4; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class S402StreamInsteadOfFor { public S402StreamInsteadOfFor() { sum(); sumAnswer1(); sumAnswer2(); sumAnswer3(); sumAnswer4(); } private void sum() { List<Integer> numbers = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); int sum = 0; for (Integer x : numbers) { sum += x; } System.out.println(sum); } private int sum = 0; private void sumAnswer1() { List<Integer> numbers = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 単純に for 文を forEach メソッドに置き換え // ただし、外部の変数へのアクセスがあるためお勧めしない numbers.stream() .forEach(x -> sum += x); System.out.println(sum); } private void sumAnswer2() { List<Integer> numbers = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 加算を reduce メソッドで置き換え int sum = numbers.stream() .reduce(0, (x, y) -> x + y); System.out.println(sum); } private void sumAnswer3() { List<Integer> numbers = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 加算を collect メソッドで置き換え // summingInt メソッドの引数には、int型を返すラムダ式を指定する // ここでは Integer -> int をオートボクシングで行うので、そのままを返す int sum = numbers.stream() .collect(Collectors.summingInt(x -> x)); System.out.println(sum); } private void sumAnswer4() { List<Integer> numbers = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // mapToInt メソッドで Integer クラスのストリームから、int のストリームに変換し // IntStream クラスの sum メソッドで合計を算出する int sum = numbers.stream() .mapToInt(x -> x) .sum(); System.out.println(sum); } public static void main(String[] args) { new S402StreamInsteadOfFor(); } }