亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java函數編程的示例分析

發布時間:2021-11-17 11:05:19 來源:億速云 閱讀:159 作者:小新 欄目:開發技術

小編給大家分享一下Java函數編程的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

一、函數編程Lambda

我們可以將lambda表達式視為一個匿名函數,可以將其分配給變量并傳遞給方法,該方法接受函數接口作為參數。Lambda表達式沒有名稱,但它有一個參數列表、一個主體和一個返回類型。

(parameters) -> expression

lambda表達式可以在函數接口的上下文中使用。

1、接口

函數接口是只指定一個抽象方法的接口。

public interface Comparator<T> {                           
    int compare(T o1, T o2);
}
public interface Runnable {                                
    void run();
}

Lambda表達式允許我們直接內聯提供函數接口的抽象方法的實現,并將整個表達式視為函數接口的實例。

函數描述符:

我們將函數接口的抽象方法的簽名稱為函數描述符。函數描述符描述lambda表達式的簽名。例如,我們可以將Runnable的函數描述符看作()->void,因為它有一個抽象方法,不接受任何內容,也不返回任何內容(void)。

二、Java函數接口

1、Predicate

Predicate<T>接口定義了一個名為test的抽象方法,該方法接受一個泛型類型為T的對象并返回一個布爾值。此接口可用于表示使用T類型對象的布爾表達式。

函數描述符: T->boolean

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}

2、Consumer

java.util.function.Consumer<T>接口定義了一個名為accept的抽象方法,該方法接受一個泛型類型為T的對象,并且不返回任何結果(void)。當我們需要訪問T類型的對象并對其執行某些操作時,可以使用此接口。

函數描述符T->void

3、Function

java.util.function.function<T,R>接口定義了一個名為apply的抽象方法,該方法將一個泛型類型為T的對象作為輸入,并返回一個泛型類型為R的對象。當我們需要定義一個lambda將信息從輸入對象映射到輸出時,可以使用該接口。

函數描述符T->R

4、Supplier

接口java.util.function.Supplier<T>定義了一個名為get的抽象方法,該方法不接受任何內容并返回類型為T的對象。

函數描述符()->R

Primitive Specializations

原語接口是專用接口,用于在輸入或輸出為原語時避免自動裝箱操作。

public interface IntPredicate {
    boolean test(int t);
}

三、類型檢查

lambda的類型是從使用lambda的上下文中推導出來的。上下文中lambda表達式所需的類型(例如,傳遞給它的方法參數或分配給它的局部變量)稱為目標類型。Lambda表達式可以從賦值上下文、方法調用上下文(參數和返回)和強制轉換上下文中獲取其目標類型。

Object o = (Runnable) () -> System.out.println("Hello");

1、Capturing Lambda

lambda可以不受限制地捕獲(在其主體中引用)實例變量和靜態變量。但是當捕獲局部變量時,它們必須顯式地聲明為final或實際上是final

我們為何有這個限制?

實例變量存儲在堆上,而局部變量位于堆棧上。如果lambda可以直接訪問局部變量,并且lambda在線程中使用,那么使用lambda的線程可以在分配變量的線程解除分配變量后嘗試訪問該變量。因此,Java將對自由局部變量的訪問實現為對其副本的訪問,而不是對原始變量的訪問。如果局部變量只分配給一次,則這沒有什么區別,因此存在限制。

四、方法引用

有三種主要的方法參考:

  •    對靜態方法的方法引用。例如,–Integer::parseInt

  • 對任意類型的實例方法的方法引用。示例–String::length

  • 對現有對象或表達式的實例方法的方法引用。示例–student::getRank,其中student是具有方法getRankstudent類型的局部變量

List<String> list = Arrays.asList("a","b","A","B");
list.sort((s1, s2) -> s1.compareToIgnoreCase(s2));

可以寫成

List<String> list = Arrays.asList("a","b","A","B");
list.sort(String::compareToIgnoreCase);

1、構造函數引用

可以使用ClassName::new引用現有構造函數

Supplier<List<String>> supplier = ArrayList::new;Supplier<List<String>> supplier = () -> new ArrayList<>()相同;

2、組合Lambda

許多函數接口包含可用于組合lambda表達式的默認方法。組合示例-

將兩個謂詞組合成一個較大的謂詞,在兩個謂詞之間執行or操作
反向或鏈式比較器

3、Comparators

按逆序排列學生

Comparator<Student> c = Comparator.comparing(Student::getRank);
students.sort(comparing(Student::getRank).reversed());

根據姓名(反向)對學生進行排序,然后按反向順序排列

students.sort(comparing(Student::getName).reversed()
        .thenComparing(Student::getRank)); 
Predicates

Predicates接口包括三個方法:negate, and, 和 or,可用于創建更復雜的謂詞。

Predicate<Integer> naturalNumber = i -> i > 0;                                     
Predicate<Integer> naturalNumberLessThanHundred = naturalNumber.and( i -> i < 100);

4、Functions

函數接口帶有兩個默認方法,andThencompose

Consider f(x) = x2 and g(x) = x3 + 1 then

g(f(x)) ->

Function<Integer,Integer> square = n -> n*n;                         
Function<Integer,Integer> squareAndCube = square.andThen(n -> n*n*n+1);
System.out.println(squareAndCube.apply(2));  
65

f(g(x)) ->

Function<Integer,Integer> square = n -> n*n;                              
Function<Integer,Integer> squareAndCube = square.compose(n -> n*n*n + 1); 
System.out.println(squareAndCube.apply(2));

應用Lambda

讓我們看看如何編寫一個通用方法來根據veratain屬性過濾一組書籍(將其視為sqlwhere子句)。

public static List<Book> filter(Predicate<Book> where) {                
  List<Book> books = Catalogue.books();                                 
  return books.stream().filter(where).collect(Collectors.toList());     
}

Lambda表達式通過不同的過濾器過濾不同的書籍

List<Book> javaBook = filter(book -> book.getCategory().equals(JAVA));               
List<Book> joshuaBlochBook = filter(book -> book.getAuthor().equals("Joshua Bloch"));

看完了這篇文章,相信你對“Java函數編程的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

门源| 从江县| 恭城| 禹城市| 兴国县| 漳浦县| 梅河口市| 丹棱县| 眉山市| 北安市| 尤溪县| 隆尧县| 贡嘎县| 兖州市| 青田县| 泸定县| 旅游| 扶余县| 革吉县| 徐水县| 和龙市| 焦作市| 周宁县| 华亭县| 灵台县| 郁南县| 长汀县| 克山县| 布尔津县| 宽甸| 丹寨县| 大田县| 民乐县| 阳谷县| 长阳| 连云港市| 枣强县| 大新县| 阿图什市| 天门市| 咸阳市|