Java8实战

 1 import java.util.*;
 2 import java.util.stream.Collectors;
 3 
 4 public class Main {
 5     public static void main(String[] args) {
 6         List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
 7         List<Integer> squaresList = numbers.stream().map(i -> i * i).distinct().sorted().collect(Collectors.toList());
 8         squaresList.forEach(System.out::println);
 9     }
10 }
11 /*
12 4
13 9
14 25
15 49
16  */
 1 import java.util.*;
 2 
 3 public class Main {
 4     public static void main(String[] args) {
 5         List<String> n1 = Arrays.asList("b", "a", "c");
 6         List<String> n2 = Arrays.asList("y", "x", "z");
 7         sort(n1);
 8         System.out.println(n1);
 9         sort8(n2);
10         System.out.println(n2);
11     }
12 
13     private static void sort(List<String> names) {
14         Collections.sort(names, new Comparator<String>() {
15             @Override
16             public int compare(String s1, String s2) {
17                 return s1.compareTo(s2);
18             }
19         });
20     }
21 
22     private static void sort8(List<String> names) {
23         Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
24     }
25 
26 }
27 /*
28 [a, b, c]
29 [x, y, z]
30  */

Lambda表达式:允许把函数作为方法的参数传递

Lambda表达式也可称为闭包

语法格式:

1 (parameters) -> expression
2 3 (parameters) ->{ statements; }

不需要声明参数类型

一个参数不需要()

一个语句不需要{}

一个表达式返回值不需要return

 1 public class Main {
 2     public static void main(String[] args) {
 3         MathOperation add = (int a, int b) -> a + b;
 4         MathOperation sub = (a, b) -> a - b;
 5         MathOperation mul = (a, b) -> {
 6             return a * b;
 7         };
 8         MathOperation div = (int a, int b) -> a / b;
 9         System.out.println("10 + 5 = " + operate(10, 5, add));
10         System.out.println("10 - 5 = " + operate(10, 5, sub));
11         System.out.println("10 * 5 = " + operate(10, 5, mul));
12         System.out.println("10 / 5 = " + operate(10, 5, div));
13 
14         Service s1 = message -> System.out.println("Hello " + message);
15         Service s2 = (message) -> System.out.println("Hello " + message);
16         s1.sayMessage("ali");
17         s2.sayMessage("google");
18     }
19 
20     interface MathOperation {
21         int operation(int a, int b);
22     }
23 
24     interface Service {
25         void sayMessage(String message);
26     }
27 
28     private static int operate(int a, int b, MathOperation mathOperation) {
29         return mathOperation.operation(a, b);
30     }
31     
32 }
33 /*
34 10 + 5 = 15
35 10 - 5 = 5
36 10 * 5 = 50
37 10 / 5 = 2
38 Hello ali
39 Hello google
40  */
 1 public class Main {
 2     final static String str = "Hello ";
 3 
 4     public static void main(String[] args) {
 5         Service s1 = message -> System.out.println(str + message);
 6         s1.sayMessage("google");
 7     }
 8 
 9     interface Service {
10         void sayMessage(String message);
11     }
12 
13 }
14 /*
15 Hello google
16  */
 1 public class Main {
 2     public static void main(String[] args) {
 3         final int num = 1;
 4         Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
 5         s.convert(2); // 3
 6     }
 7 
 8     public interface Converter<T1, T2> {
 9         void convert(int i);
10     }
11 
12 }
 1 public class Main {
 2     public static void main(String[] args) {
 3         int num = 1;
 4         Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
 5         s.convert(2);
 6         num = 5; // 编译报错 Variable used in lambda expression should be final or effectively final
 7     }
 8 
 9     public interface Converter<T1, T2> {
10         void convert(int i);
11     }
12 
13 }
 1 import java.util.*;
 2 
 3 public class Main {
 4     public static void main(String[] args) {
 5         String first = "";
 6         Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length());
 7         // Variable first is already defined in the scope
 8     }
 9 
10 }

方法引用:配合Lambda表达式,减少冗余代码

 

默认方法:接口里有了实现的方法

Stream API:真正的函数式编程风格

Data Time API:加强对日期与时间的处理

Optional类:解决空指针异常

posted @ 2018-12-26 20:42  sakura1027  阅读(164)  评论(0编辑  收藏  举报