Junhc

岂止于博客

Java8新特性

  • 1. Lambda 表达式

    Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
    Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
    使用 Lambda 表达式可以使代码变的更加简洁紧凑。

    // 1. 不需要参数,返回值为 5  
    () -> 5  
    
    // 2. 接收一个参数(数字类型),返回其2倍的值  
    x -> 2 * x  
    
    // 3. 接受2个参数(数字),并返回他们的差值  
    (x, y) -> xy  
    
    // 4. 接收2个int型整数,返回他们的和  
    (int x, int y) -> x + y  
    
    // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
    (String s) -> System.out.print(s)
    
public class Java8Tester {
   public static void main(String args[]){
      Java8Tester tester = new Java8Tester();

      // 类型声明
      MathOperation addition = (int a, int b) -> a + b;

      // 不用类型声明
      MathOperation subtraction = (a, b) -> a - b;

      // 大括号中的返回语句
      MathOperation multiplication = (int a, int b) -> { return a * b; };

      // 没有大括号及返回语句
      MathOperation division = (int a, int b) -> a / b;

      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));

      // 不用括号
      GreetingService greetService1 = message ->
      System.out.println("Hello " + message);

      // 用括号
      GreetingService greetService2 = (message) ->
      System.out.println("Hello " + message);

      greetService1.sayMessage("Runoob");
      greetService2.sayMessage("Google");
   }

   interface MathOperation {
      int operation(int a, int b);
   }

   interface GreetingService {
      void sayMessage(String message);
   }

   private int operate(int a, int b, MathOperation mathOperation){
      return mathOperation.operation(a, b);
   }
}
// $ javac Java8Tester.java
// $ java Java8Tester
// 10 + 5 = 15
// 10 - 5 = 5
// 10 x 5 = 50
// 10 / 5 = 2
// Hello Runoob
// Hello Google
  • 2. 方法引用

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

  • 3. 函数式接口

    函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
    函数式接口可以被隐式转换为 lambda 表达式。
    Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。

@FunctionalInterface
interface GreetingService
{
    void sayMessage(String message);
}
  • 4. 默认方法

    简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。
    我们只需在方法名前面加个 default 关键字即可实现默认方法。

public interface Vehicle {
   default void print(){
      System.out.println("我是一辆车!");
   }

   // 静态方法
   static void blowHorn(){
      System.out.println("按喇叭!!!");
   }
}
public void testLocalDateTime(){

   // 获取当前的日期时间
   LocalDateTime currentTime = LocalDateTime.now();
   System.out.println("当前时间: " + currentTime);

   LocalDate date1 = currentTime.toLocalDate();
   System.out.println("date1: " + date1);

   Month month = currentTime.getMonth();
   int day = currentTime.getDayOfMonth();
   int seconds = currentTime.getSecond();

   System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);

   LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);
   System.out.println("date2: " + date2);

   // 12 december 2014
   LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
   System.out.println("date3: " + date3);

   // 22 小时 15 分钟
   LocalTime date4 = LocalTime.of(22, 15);
   System.out.println("date4: " + date4);

   // 解析字符串
   LocalTime date5 = LocalTime.parse("20:15:30");
   System.out.println("date5: " + date5);
}

// $ javac Java8Tester.java
// $ java Java8Tester
// 当前时间: 2016-04-15T16:55:48.668
// date1: 2016-04-15
//: APRIL,: 15,: 48
// date2: 2012-04-10T16:55:48.668
// date3: 2014-12-12
// date4: 22:15
// date5: 20:15:30

public void testZonedDateTime(){

   // 获取当前时间日期
   ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]");
   System.out.println("date1: " + date1);

   ZoneId id = ZoneId.of("Europe/Paris");
   System.out.println("ZoneId: " + id);

   ZoneId currentZone = ZoneId.systemDefault();
   System.out.println("当期时区: " + currentZone);
}

// $ javac Java8Tester.java
// $ java Java8Tester
// date1: 2015-12-03T10:15:30+08:00[Asia/Shanghai]
// ZoneId: Europe/Paris
// 当期时区: Asia/Shanghai