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的 函數語言程式設計,該包中的函式式介面有:
1 | BiConsumer<T,U> 代表了一個接受兩個輸入引數的操作,並且不返回任何結果 |
2 | BiFunction<T,U,R> 代表了一個接受兩個輸入引數的方法,並且返回一個結果 |
3 | BinaryOperator<T> 代表了一個作用於於兩個同型別操作符的操作,並且返回了操作符同型別的結果 |
4 | BiPredicate<T,U> 代表了一個兩個引數的boolean值方法 |
5 | BooleanSupplier 代表了boolean值結果的提供方 |
6 | Consumer<T> 代表了接受一個輸入引數並且無返回的操作 |
7 | DoubleBinaryOperator 代表了作用於兩個double值操作符的操作,並且返回了一個double值的結果。 |
8 | DoubleConsumer 代表一個接受double值引數的操作,並且不返回結果。 |
9 | DoubleFunction<R> 代表接受一個double值引數的方法,並且返回結果 |
10 | DoublePredicate 代表一個擁有double值引數的boolean值方法 |
11 | DoubleSupplier 代表一個double值結構的提供方 |
12 | DoubleToIntFunction 接受一個double型別輸入,返回一個int型別結果。 |
13 | DoubleToLongFunction 接受一個double型別輸入,返回一個long型別結果 |
14 | DoubleUnaryOperator 接受一個引數同為型別double,返回值型別也為double 。 |
15 | Function<T,R> 接受一個輸入引數,返回一個結果。 |
16 | IntBinaryOperator 接受兩個引數同為型別int,返回值型別也為int 。 |
17 | IntConsumer 接受一個int型別的輸入引數,無返回值 。 |
18 | IntFunction<R> 接受一個int型別輸入引數,返回一個結果 。 |
19 | IntPredicate :接受一個int輸入引數,返回一個布林值的結果。 |
20 | IntSupplier 無引數,返回一個int型別結果。 |
21 | IntToDoubleFunction 接受一個int型別輸入,返回一個double型別結果 。 |
22 | IntToLongFunction 接受一個int型別輸入,返回一個long型別結果。 |
23 | IntUnaryOperator 接受一個引數同為型別int,返回值型別也為int 。 |
24 | LongBinaryOperator 接受兩個引數同為型別long,返回值型別也為long。 |
25 | LongConsumer 接受一個long型別的輸入引數,無返回值。 |
26 | LongFunction<R> 接受一個long型別輸入引數,返回一個結果。 |
27 | LongPredicate R接受一個long輸入引數,返回一個布林值型別結果。 |
28 | LongSupplier 無引數,返回一個結果long型別的值。 |
29 | LongToDoubleFunction 接受一個long型別輸入,返回一個double型別結果。 |
30 | LongToIntFunction 接受一個long型別輸入,返回一個int型別結果。 |
31 | LongUnaryOperator 接受一個引數同為型別long,返回值型別也為long。 |
32 | ObjDoubleConsumer<T> 接受一個object型別和一個double型別的輸入引數,無返回值。 |
33 | ObjIntConsumer<T> 接受一個object型別和一個int型別的輸入引數,無返回值。 |
34 | ObjLongConsumer<T> 接受一個object型別和一個long型別的輸入引數,無返回值。 |
35 | Predicate<T> 接受一個輸入引數,返回一個布林值結果。 |
36 | Supplier<T> 無引數,返回一個結果。 |
37 | ToDoubleBiFunction<T,U> 接受兩個輸入引數,返回一個double型別結果 |
38 | ToDoubleFunction<T> 接受一個輸入引數,返回一個double型別結果 |
39 | ToIntBiFunction<T,U> 接受兩個輸入引數,返回一個int型別結果。 |
40 | ToIntFunction<T> 接受一個輸入引數,返回一個int型別結果。 |
41 | ToLongBiFunction<T,U> 接受兩個輸入引數,返回一個long型別結果。 |
42 | ToLongFunction<T> 接受一個輸入引數,返回一個long型別結果。 |
43 | UnaryOperator<T> 接受一個引數為型別T,返回值型別也為T。 |
函式式介面例項
Predicate <T> 介面是一個函式式介面,它接受一個輸入引數 T,返回一個布林值結果。
該介面包含多種預設方法來將Predicate組合成其他複雜的邏輯(比如:與,或,非)。
該介面用於測試物件是 true 或 false。
我們可以通過以下例項(Java8Tester.java)來了解函式式介面 Predicate <T> 的使用:
輸出結果為:
写评论
很抱歉,必須登入網站才能發佈留言。