1.Lambda表达式

1.1 语法
lambda 表达式的语法格式如下:
(parameters) -> expression或(parameters) ->{statements; }
以下是lambda表达式的重要特征:
· 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
· 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
· 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
· 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
1.2java示例

  1. public class Java8Test {
  2. public static void main(String args[]) {
  3. interfaceMessage a = s -> System.out.println(s);
  4. a.sayMessage1("aaa");
  5. }
  6. interface interfaceMessage {
  7. void sayMessage1(String name);
  8. }
  9. }
  10. //打印aaa

1.3 变量作用域
lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在lambda 内部修改定义在域外的局部变量,否则会编译错误。
在Java8Tester.java 文件输入以下代码:

  1. public class Java8Test {
  2. final static String salutation = "Hello! ";
  3. public static void main(String args[]) {
  4. interfaceMessage a = s -> System.out.println(salutation + s);
  5. a.sayMessage1("aaa");
  6. }
  7. interface interfaceMessage {
  8. void sayMessage1(String name);
  9. }
  10. }
  11. //打印Hello! aaa

注意:lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有final 的语义)
image.png

把最后一行salutation = “hi”;去掉即可。

2.方法引用

1.1
方法引用通过方法的名字来指向一个方法。
方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
方法引用使用一对冒号 :: 。
1.2java代码示例

  1. class Car {
  2. @FunctionalInterface
  3. public interface Supplier<T> {
  4. T get();
  5. }
  6. //Supplier是jdk1.8的接口,这里和lamda一起使用了
  7. public static Car create(final Supplier<Car> supplier) {
  8. return supplier.get();
  9. }
  10. public static void collide(final Car car) {
  11. System.out.println("Collided " + car.toString());
  12. }
  13. public void follow(final Car another) {
  14. System.out.println("Following the " + another.toString());
  15. }
  16. public void repair() {
  17. System.out.println("Repaired " + this.toString());
  18. }
  19. public static void main(String[] args) {
  20. //构造器引用:它的语法是Class::new,或者更一般的Class< T >::new实例如下:
  21. Car car = Car.create(Car::new);
  22. Car car1 = Car.create(Car::new);
  23. Car car2 = Car.create(Car::new);
  24. Car car3 = new Car();
  25. List<Car> cars = Arrays.asList(car,car1,car2,car3);
  26. System.out.println("===================构造器引用========================");
  27. //静态方法引用:它的语法是Class::static_method,实例如下:
  28. cars.forEach(Car::collide);
  29. System.out.println("===================静态方法引用========================");
  30. //特定类的任意对象的方法引用:它的语法是Class::method实例如下:
  31. cars.forEach(Car::repair);
  32. System.out.println("==============特定类的任意对象的方法引用================");
  33. //特定对象的方法引用:它的语法是instance::method实例如下:
  34. final Car police = Car.create(Car::new);
  35. cars.forEach(police::follow);
  36. System.out.println("===================特定对象的方法引用===================");
  37. }
  38. }

总结:
image.png

3.stream流

4.函数式接口

5.optional类

6.Nashorn JavaScript

7.日期时间API

8.Base64