1. 程式人生 > >JDK8的新特性

JDK8的新特性

方法的參數 ora public fin ger reference true test function

  Java 8 (又稱為 jdk 1.8) 是 Java 語言開發的一個主要版本。Oracle 公司於 2014 年 3 月 18 日發布 Java 8 ,它支持函數式編程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。

  應該說,相對於Java7,Java8 新增了很多特性,我們主要討論以下幾個:

  1.Lambda表達式。

  Lambda 表達式,也可以稱為閉包,它允許把函數作為一個方法的參數(函數作為參數傳遞進方法中)。使用 Lambda 表達式可以使代碼變的更加簡潔緊湊。  

package com.itszt.test2;
import java.util.ArrayList;
import java.util.List;
/**
 * JDK8的新特性
 */
public class Test {
    //測試數據
    public static List<Integer> list = new ArrayList<>();
    public static void main(String[] args) {
        int[] intArr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        for (Integer i : intArr) {
            list.add(i);
        }
        Test test = new Test();
        //測試Lambda表達式
        test.testLambda(list);
    }

    public void testLambda(List list) {
        list.forEach(System.out::println);
        list.forEach(e -> System.out.println("方式二:" + e));
    }

}

  2.方法引用。  

  方法引用通過方法的名字來指向一個方法。

  方法引用可以使語言的構造更緊湊簡潔,減少冗余代碼。

  方法引用使用一對冒號 :: 。

  比如,上述代碼中就使用了方法引用。再比如:

public void testMethodReference() {
        //構造器引用。語法是Class::new,或者更一般的Class< T >::new,
        // 要求構造器方法是沒有參數
        final Car car = Car.create(Car::new);
        final List<Car> cars = Arrays.asList(car);
        //靜態方法引用。語法是Class::static_method,要求接受一個Class類型的參數;
        cars.forEach(Car::collide);
        //任意對象的方法引用。它的語法是Class::method。無參,所有元素調用;
        cars.forEach(Car::repair);
        //特定對象的方法引用,它的語法是instance::method。有參,在某個對象上調用方法,將列表元素作為參數傳入;
        final Car police = Car.create(Car::new);
        cars.forEach(police::follow);
    }
    public static class Car {
        public static Car create(final Supplier<Car> supplier) {
            return supplier.get();
        }

        public static void collide(final Car car) {
            System.out.println("靜態方法引用 " + car.toString());
        }

        public void repair() {
            System.out.println("任意對象的方法引用 " + this.toString());
        }

        public void follow(final Car car) {
            System.out.println("特定對象的方法引用 " + car.toString());
        }
    } 

  3.函數式接口。  

  函數式接口(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。

  函數式接口可以被隱式轉換為lambda表達式。

  函數式接口可以現有的函數友好地支持 lambda。  

  JDK 1.8之前已有的函數式接口:

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.util.Comparator
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
  • java.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener

  JDK 1.8 新增加的函數接口:

  • java.util.function

  

JDK8的新特性