學習Java8新特性

學習Java8新特性

1.排序

        // 使用 java 7 排序
private void sortUsingJava7(List<String> names) {
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});

}

// 使用 java 8 排序
private void sortUsingJava8(List<String> names) {
Collections.sort(names, (s1, s2) -> s1.compareTo(s2));

}

2.Lambda表示式

lambda 表示式的語法格式如下:(parameters) -> expression或(parameters) ->{ statements; }

lambda表示式的重要特徵如下:

  • 可選型別宣告:不需要宣告引數型別,編譯器可以統一識別引數值。
  • 可選的引數圓括號:一個引數無需定義圓括號,但多個引數需要定義圓括號。
  • 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
  • 可選的返回關鍵字:如果主體只有一個表示式返回值則編譯器會自動返回值,大括號需要指定明表示式返回了一個數值。

lambda表示式例項如下:


返回結果如下:



使用 Lambda 表示式需要注意以下兩點:

  • Lambda 表示式主要用來定義行內執行的方法型別介面,例如,一個簡單方法介面。在上面例子中,我們使用各種型別的Lambda表示式來定義MathOperation介面的方法。然後我們定義了sayMessage的執行。
  • Lambda 表示式免去了使用匿名方法的麻煩,並且給予Java簡單但是強大的函式化的程式設計能力。

變數作用域

lambda 表示式只能引用 final 或 final 區域性變數,這就是說不能在 lambda 內部修改定義在域外的區域性變數,否則會編譯錯誤。


3.方法引用

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

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

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

構造器引用:它的語法是Class::new,或者更一般的Class< T >::new例項如下:

final Car car = Car.create( Car::new );

final List< Car > cars = Arrays.asList( car );

靜態方法引用:它的語法是Class::static_method,例項如下:

cars.forEach( Car::collide );

特定類的任意物件的方法引用:它的語法是Class::method例項如下:

cars.forEach( Car::repair );

特定物件的方法引用:它的語法是instance::method例項如下:

final Car police = Car.create( Car::new );

cars.forEach( police::follow );

方法引用例項

4.函式式介面

函式式介面(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

java.util.function 它包含了很多類,用來支援 Java的 函數語言程式設計,該包中的函式式介面有:

1BiConsumer<T,U>

代表了一個接受兩個輸入引數的操作,並且不返回任何結果

2BiFunction<T,U,R>

代表了一個接受兩個輸入引數的方法,並且返回一個結果

3BinaryOperator<T>

代表了一個作用於於兩個同型別操作符的操作,並且返回了操作符同型別的結果

4BiPredicate<T,U>

代表了一個兩個引數的boolean值方法

5BooleanSupplier

代表了boolean值結果的提供方

6Consumer<T>

代表了接受一個輸入引數並且無返回的操作

7DoubleBinaryOperator

代表了作用於兩個double值操作符的操作,並且返回了一個double值的結果。

8DoubleConsumer

代表一個接受double值引數的操作,並且不返回結果。

9DoubleFunction<R>

代表接受一個double值引數的方法,並且返回結果

10DoublePredicate

代表一個擁有double值引數的boolean值方法

11DoubleSupplier

代表一個double值結構的提供方

12DoubleToIntFunction

接受一個double型別輸入,返回一個int型別結果。

13DoubleToLongFunction

接受一個double型別輸入,返回一個long型別結果

14DoubleUnaryOperator

接受一個引數同為型別double,返回值型別也為double 。

15Function<T,R>

接受一個輸入引數,返回一個結果。

16IntBinaryOperator

接受兩個引數同為型別int,返回值型別也為int 。

17IntConsumer

接受一個int型別的輸入引數,無返回值 。

18IntFunction<R>

接受一個int型別輸入引數,返回一個結果 。

19IntPredicate

:接受一個int輸入引數,返回一個布林值的結果。

20IntSupplier

無引數,返回一個int型別結果。

21IntToDoubleFunction

接受一個int型別輸入,返回一個double型別結果 。

22IntToLongFunction

接受一個int型別輸入,返回一個long型別結果。

23IntUnaryOperator

接受一個引數同為型別int,返回值型別也為int 。

24LongBinaryOperator

接受兩個引數同為型別long,返回值型別也為long。

25LongConsumer

接受一個long型別的輸入引數,無返回值。

26LongFunction<R>

接受一個long型別輸入引數,返回一個結果。

27LongPredicate

R接受一個long輸入引數,返回一個布林值型別結果。

28LongSupplier

無引數,返回一個結果long型別的值。

29LongToDoubleFunction

接受一個long型別輸入,返回一個double型別結果。

30LongToIntFunction

接受一個long型別輸入,返回一個int型別結果。

31LongUnaryOperator

接受一個引數同為型別long,返回值型別也為long。

32ObjDoubleConsumer<T>

接受一個object型別和一個double型別的輸入引數,無返回值。

33ObjIntConsumer<T>

接受一個object型別和一個int型別的輸入引數,無返回值。

34ObjLongConsumer<T>

接受一個object型別和一個long型別的輸入引數,無返回值。

35Predicate<T>

接受一個輸入引數,返回一個布林值結果。

36Supplier<T>

無引數,返回一個結果。

37ToDoubleBiFunction<T,U>

接受兩個輸入引數,返回一個double型別結果

38ToDoubleFunction<T>

接受一個輸入引數,返回一個double型別結果

39ToIntBiFunction<T,U>

接受兩個輸入引數,返回一個int型別結果。

40ToIntFunction<T>

接受一個輸入引數,返回一個int型別結果。

41ToLongBiFunction<T,U>

接受兩個輸入引數,返回一個long型別結果。

42ToLongFunction<T>

接受一個輸入引數,返回一個long型別結果。

43UnaryOperator<T>

接受一個引數為型別T,返回值型別也為T。

函式式介面例項

Predicate <T> 介面是一個函式式介面,它接受一個輸入引數 T,返回一個布林值結果。

該介面包含多種預設方法來將Predicate組合成其他複雜的邏輯(比如:與,或,非)。

該介面用於測試物件是 true 或 false。

我們可以通過以下例項(Java8Tester.java)來了解函式式介面 Predicate <T> 的使用:

輸出結果為: