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类:解决空指针异常