最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的函數(shù)式編程

 更新時間:2021年10月18日 09:16:37   作者:sofia  
這篇文章介紹Java中的函數(shù)式編程,函數(shù)式編程是一種編程范式,其中程序是通過應用和組合函數(shù)來構造的。它是一種聲明式編程范式,其中函數(shù)定義是表達式樹,每個表達式樹返回一個值,而不是一系列改變程序狀態(tài)的命令語句,具體情況請看下文,希望對你有所幫助

函數(shù)式編程是一種編程范式,其中程序是通過應用和組合函數(shù)來構造的。它是一種聲明式編程范式,其中函數(shù)定義是表達式樹,每個表達式樹返回一個值,而不是一系列改變程序狀態(tài)的命令語句

Java8引入了Lambda形式的函數(shù)式編程。術語Lambda來自Lambda演算,用于描述計算。

1、Lambda

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

(parameters) -> expression

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

2、函數(shù)接口

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

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

Lambda表達式允許我們直接內(nèi)聯(lián)提供函數(shù)接口的抽象方法的實現(xiàn),并將整個表達式視為函數(shù)接口的實例。

2.1 函數(shù)描述符

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

3、Java函數(shù)接口

3.1 Predicate

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

函數(shù)描述符: T->boolean

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


3.2 Consumer

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

函數(shù)描述符: T->void

3.3 Function

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

函數(shù)描述符: T->R

3.4 Supplier

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

函數(shù)描述符: ()->R

3.5 Primitive Specializations

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

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

4、類型檢查

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

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

4.1 Capturing Lambda

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

我們?yōu)楹斡羞@個限制?

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

5、方法引用

有三種主要的方法參考:

  • 對靜態(tài)方法的方法引用。例如, – Integer::parseInt
  • 對任意類型的實例方法的方法引用。示例– String::length
  • 對現(xiàn)有對象或表達式的實例方法的方法引用。示例– student::getRank ,其中 student 是具有方法 getRank() student 類型的局部變量
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);

5.1 構造函數(shù)引用

可以使用 ClassName::new 引用現(xiàn)有構造函數(shù)

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

5.2 組合Lambda

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

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

5.3 Comparators

按逆序排列學生

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


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

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


5.4 Predicates

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

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

5.5 Functions

函數(shù)接口帶有兩個默認方法, andThen compose 。

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

讓我們看看如何編寫一個通用方法來根據(jù) 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"));

6、總結

lambda表達式可以被認為是一個匿名函數(shù),可以在函數(shù)接口的上下文中使用。函數(shù)接口是只指定一個抽象方法的接口。

到此這篇關于Java中的函數(shù)式編程的文章就介紹到這了,更多相關Java 函數(shù)式編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring?DI依賴注入過程解析

    Spring?DI依賴注入過程解析

    依賴注入是由“依賴”和“注入”兩個詞匯組合而成,那么我們再一次順藤摸瓜,分別分析這兩個詞語,這篇文章主要介紹了Spring?DI依賴注入詳解,需要的朋友可以參考下
    2022-11-11
  • Java編程實現(xiàn)中英混合字符串數(shù)組按首字母排序的方法

    Java編程實現(xiàn)中英混合字符串數(shù)組按首字母排序的方法

    這篇文章主要介紹了Java編程實現(xiàn)中英混合字符串數(shù)組按首字母排序的方法,涉及Java字符串操作及拼音轉換的相關使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Java的Hibernate框架中復合主鍵映射的創(chuàng)建和使用教程

    Java的Hibernate框架中復合主鍵映射的創(chuàng)建和使用教程

    復合主鍵映射用起來比普通的增加主鍵字段要復雜,這里我們就來共同學習Java的Hibernate框架中復合主鍵映射的創(chuàng)建和使用教程,需要的朋友可以參考下
    2016-07-07
  • Java精品項目瑞吉外賣之員工新增篇

    Java精品項目瑞吉外賣之員工新增篇

    這篇文章主要為大家詳細介紹了java精品項目-瑞吉外賣訂餐系統(tǒng),此項目過大,分為多章獨立講解,本篇內(nèi)容為新增員工功能的實現(xiàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java 最優(yōu)二叉樹的哈夫曼算法的簡單實現(xiàn)

    Java 最優(yōu)二叉樹的哈夫曼算法的簡單實現(xiàn)

    這篇文章主要介紹了Java 最優(yōu)二叉樹的哈夫曼算法的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Java實現(xiàn)簡單樹結構

    Java實現(xiàn)簡單樹結構

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單樹結構的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • java實現(xiàn)音樂播放器完整代碼(調(diào)整顯示音量大小、調(diào)整進度、圖片切換)

    java實現(xiàn)音樂播放器完整代碼(調(diào)整顯示音量大小、調(diào)整進度、圖片切換)

    這篇文章主要給大家介紹了關于java實現(xiàn)音樂播放器(調(diào)整顯示音量大小、調(diào)整進度、圖片切換)的相關資料,這本身是老師布置的一個作業(yè),寫完感覺不錯分享給大家,需要的朋友可以參考下
    2023-07-07
  • Java中的阻塞隊列詳細介紹

    Java中的阻塞隊列詳細介紹

    這篇文章主要介紹了Java中的阻塞隊列詳細介紹的相關資料,需要的朋友可以參考下
    2016-11-11
  • WxJava微信公眾號開發(fā)入門實戰(zhàn)

    WxJava微信公眾號開發(fā)入門實戰(zhàn)

    本文主要介紹了WxJava微信公眾號開發(fā)入門實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • SpringMVC+Shiro的基本使用及功能介紹

    SpringMVC+Shiro的基本使用及功能介紹

    本文給大家介紹SpringMVC+Shiro的基本使用,Apache?Shiro是Java的一個安全框架,Shiro本身無法知道所持有令牌的用戶是否合法,因為除了項目的設計人員恐怕誰都無法得知,本文只介紹最常見也最重要的一種實現(xiàn)方式數(shù)據(jù)庫查詢
    2022-04-04

最新評論

饶河县| 德清县| 青冈县| 来安县| 上高县| 五台县| 谢通门县| 上思县| 望奎县| 拉萨市| 丰都县| 井陉县| 庆安县| 岢岚县| 太谷县| 桐庐县| 莱州市| 民县| 东宁县| 延津县| 库伦旗| 萝北县| 东阿县| 克山县| 通辽市| 勐海县| 准格尔旗| 石楼县| 武隆县| 邓州市| 双柏县| 绥中县| 会东县| 临漳县| 姜堰市| 上栗县| 巴里| 阳谷县| 莆田市| 崇州市| 普格县|