package answers.section2; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Random; public class S201LambdaInsteadOfAnonClass { public S201LambdaInsteadOfAnonClass() { rewriteByLambda(); rewriteByLambdaAnswer1(); rewriteByLambdaAnswer2(); rewriteByLambdaAnswer3(); rewriteByLambdaAnswer4(); } // 2-1 Qusetion Lambda 式で書きかえてみましょう private void rewriteByLambda() { // この匿名クラスを Lambda 式で書きかえ Comparator<Integer> comparator = new Comparator<Integer>() { @Override public int compare(Integer x, Integer y) { return Integer.compare(x, y); } }; List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 10; i++) { numbers.add(i); } Random random = new Random(); for (int i = 0; i < 10; i++) { Integer number = numbers.remove(random.nextInt(10 - i)); numbers.add(number); } System.out.println("Before Sort: " + numbers); // 整数のリストをソート Collections.sort(numbers, comparator); System.out.println("After Sort: " + numbers); } private void rewriteByLambdaAnswer1() { // 匿名クラスを Lambda 式で置き換え Comparator<Integer> comparator = (Integer x, Integer y) -> { return Integer.compare(x, y); }; List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 10; i++) { numbers.add(i); } Random random = new Random(); for (int i = 0; i < 10; i++) { Integer number = numbers.remove(random.nextInt(10 - i)); numbers.add(number); } System.out.println("Before Sort: " + numbers); // 整数のリストをソート Collections.sort(numbers, comparator); System.out.println("After Sort: " + numbers); } private void rewriteByLambdaAnswer2() { // Lambda 式の引数の型を省略 // 省略する場合、すべての引数の型を省略する // 一部だけ省略することは NG Comparator<Integer> comparator = (x, y) -> { return Integer.compare(x, y); }; List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 10; i++) { numbers.add(i); } Random random = new Random(); for (int i = 0; i < 10; i++) { Integer number = numbers.remove(random.nextInt(10 - i)); numbers.add(number); } System.out.println("Before Sort: " + numbers); // 整数のリストをソート Collections.sort(numbers, comparator); System.out.println("After Sort: " + numbers); } private void rewriteByLambdaAnswer3() { // メソッドの本体が 1 つの式だけの場合、波カッコと return 文を省略可能 Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y); List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 10; i++) { numbers.add(i); } Random random = new Random(); for (int i = 0; i < 10; i++) { Integer number = numbers.remove(random.nextInt(10 - i)); numbers.add(number); } System.out.println("Before Sort: " + numbers); // 整数のリストをソート Collections.sort(numbers, comparator); System.out.println("After Sort: " + numbers); } private void rewriteByLambdaAnswer4() { // メソッドの本体で、他のメソッドコールを行っているだけなので、 // メソッド参照が使える Comparator<Integer> comparator = Integer::compare; List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 10; i++) { numbers.add(i); } Random random = new Random(); for (int i = 0; i < 10; i++) { Integer number = numbers.remove(random.nextInt(10 - i)); numbers.add(number); } System.out.println("Before Sort: " + numbers); // 整数のリストをソート Collections.sort(numbers, comparator); System.out.println("After Sort: " + numbers); } public static void main(String... args) { new S201LambdaInsteadOfAnonClass(); } }