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

Java 函數(shù)編程詳細(xì)介紹

 更新時(shí)間:2021年11月17日 10:09:07   作者:sofia  
這篇文章主要介紹了Java函數(shù)式編程,lambda表達(dá)式可以被認(rèn)為是一個(gè)匿名函數(shù),可以在函數(shù)接口的上下文中使用。函數(shù)接口是只指定一個(gè)抽象方法的接口,下面來(lái)看文章的詳細(xì)內(nèi)容,需要的朋友可以參考下

前言:

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

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

一、函數(shù)編程Lambda

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

(parameters) -> expression

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

1、接口

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

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


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

函數(shù)描述符:

我們將函數(shù)接口的抽象方法的簽名稱為函數(shù)描述符。函數(shù)描述符描述lambda表達(dá)式的簽名。例如,我們可以將Runnable的函數(shù)描述符看作()->void,因?yàn)樗幸粋€(gè)抽象方法,不接受任何內(nèi)容,也不返回任何內(nèi)容(void)。

二、Java函數(shù)接口

1、Predicate

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

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

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

2、Consumer

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

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

3、Function

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

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

4、Supplier

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

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

Primitive Specializations

原語(yǔ)接口是專用接口,用于在輸入或輸出為原語(yǔ)時(shí)避免自動(dòng)裝箱操作。

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

三、類型檢查

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

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

1、Capturing Lambda

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

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

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

四、方法引用

有三種主要的方法參考:

  •    對(duì)靜態(tài)方法的方法引用。例如,–Integer::parseInt
  • 對(duì)任意類型的實(shí)例方法的方法引用。示例–String::length
  • 對(duì)現(xiàn)有對(duì)象或表達(dá)式的實(shí)例方法的方法引用。示例–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、構(gòu)造函數(shù)引用

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

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

2、組合Lambda

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

將兩個(gè)謂詞組合成一個(gè)較大的謂詞,在兩個(gè)謂詞之間執(zhí)行or操作
反向或鏈?zhǔn)奖容^器

3、Comparators

按逆序排列學(xué)生

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

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

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


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

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

4、Functions

函數(shù)接口帶有兩個(gè)默認(rèn)方法,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));                               

應(yīng)用Lambda

讓我們看看如何編寫一個(gè)通用方法來(lái)根據(jù)veratain屬性過(guò)濾一組書(shū)籍(將其視為sqlwhere子句)。

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

Lambda表達(dá)式通過(guò)不同的過(guò)濾器過(guò)濾不同的書(shū)籍

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

五、總結(jié)

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

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

相關(guān)文章

  • 淺談Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組知識(shí)總結(jié)

    淺談Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組知識(shí)總結(jié)

    今天帶大家了解一下Java稀疏數(shù)組的相關(guān)知識(shí),文中有非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • 我總結(jié)的幾種@Transactional失效原因說(shuō)明

    我總結(jié)的幾種@Transactional失效原因說(shuō)明

    這篇文章主要是我總結(jié)的幾種@Transactional失效原因說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java對(duì)接微信支付全過(guò)程

    Java對(duì)接微信支付全過(guò)程

    本文主要介紹了Java對(duì)接微信支付全過(guò)程,涵蓋注冊(cè)商戶、生成預(yù)支付訂單、處理回調(diào)和查詢訂單狀態(tài)等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • 使用Java Minio搭建自己的文件系統(tǒng)詳解

    使用Java Minio搭建自己的文件系統(tǒng)詳解

    這篇文章主要介紹了使用Java Minio搭建自己的文件系統(tǒng)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 自定義SpringBoot的白標(biāo)錯(cuò)誤頁(yè)面的操作方法

    自定義SpringBoot的白標(biāo)錯(cuò)誤頁(yè)面的操作方法

    Spring Boot的白標(biāo)錯(cuò)誤頁(yè)面是在應(yīng)用程序出現(xiàn)錯(cuò)誤時(shí)(如404或500 HTTP狀態(tài)碼)自動(dòng)生成的默認(rèn)錯(cuò)誤頁(yè)面,下面小編給大家分享如何自定義SpringBoot的白標(biāo)錯(cuò)誤頁(yè)面,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • 帶你輕松了解Modbus協(xié)議

    帶你輕松了解Modbus協(xié)議

    這篇文章主要給大家介紹了關(guān)于Modbus協(xié)議的相關(guān)資料,此協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的,需要的朋友可以參考下
    2021-11-11
  • Java中的static--靜態(tài)變量你了解嗎

    Java中的static--靜態(tài)變量你了解嗎

    Java 中被 static 修飾的成員稱為靜態(tài)成員或類成員。它屬于整個(gè)類所有,而不是某個(gè)對(duì)象所有,即被類的所有對(duì)象所共享。靜態(tài)成員可以使用類名直接訪問(wèn),也可以使用對(duì)象名進(jìn)行訪問(wèn),.下面我們來(lái)詳細(xì)了解一下吧
    2021-09-09
  • WebService的相關(guān)概念

    WebService的相關(guān)概念

    這篇文章主要介紹了WebService的相關(guān)概念的相關(guān)資料,需要的朋友可以參考下
    2017-10-10
  • Log4j定時(shí)打印日志及添加模塊名配置的Java代碼實(shí)例

    Log4j定時(shí)打印日志及添加模塊名配置的Java代碼實(shí)例

    這篇文章主要介紹了Log4j定時(shí)打印日志及添加模塊名配置的Java代碼實(shí)例,Log4j是Apache的一個(gè)開(kāi)源Java日志項(xiàng)目,需要的朋友可以參考下
    2016-01-01
  • RabbitMQ 實(shí)現(xiàn)延遲隊(duì)列的兩種方式詳解

    RabbitMQ 實(shí)現(xiàn)延遲隊(duì)列的兩種方式詳解

    很多場(chǎng)景下我們都需要延遲隊(duì)列。這篇文章主要以RabbitMQ為例來(lái)和大家聊一聊延遲隊(duì)列的玩法。文中的代碼具有一定的學(xué)習(xí)價(jià)值,感興趣的同學(xué)可以了解一下
    2021-12-12

最新評(píng)論

华宁县| 岐山县| 于田县| 隆子县| 阳信县| 合水县| 宜阳县| 鄂伦春自治旗| 独山县| 四会市| 满城县| 陆丰市| 台中县| 临澧县| 遵化市| 宁都县| 宝山区| 蓬莱市| 雷波县| 南郑县| 甘孜| 连州市| 延安市| 浮山县| 绍兴市| 洛浦县| 大荔县| 巩留县| 清原| 甘南县| 卫辉市| 南陵县| 贺州市| 高唐县| 大田县| 鱼台县| 洪湖市| 惠安县| 平山县| 额济纳旗| 宿松县|