java function void_Java8中你可能不知道的一些地方之函數式接口實戰

0360c8141433d63df3d4e7d5b4d9fe9f.png

什么時候可以使用 Lambda?通常 Lambda 表達式是用在函數式接口上使用的。從 Java8 開始引入了函數式接口,其說明比較簡單:函數式接口(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。 java8 引入 @FunctionalInterface 注解聲明該接口是一個函數式接口。

一、語法抽象方法有且僅有一個

接口使用 @FunctionalInterface 注解進行標注

接口中可以存在默認方法和靜態方法實現

如下形式:

/**

*?定義函數式接口

*?接口上標注@FunctionalInterface?注解

*/

@FunctionalInterface

public?interface?ICollectionService{

/**

*?定義打印方法

*/

void?print();

}

在 Java8 以前,已有大量函數式接口形式的接口(接口中只存在一個抽象方法),只是沒有強制聲明。例如 java.lang.Runnable,java.util.concurrent.Callable,java.security.PrivilegedAction,java.io.FileFilter 等,Java8 新增加的函數接口在 java.util.function 包下,它包含了很多類,用來支持 Java 的函數式編程,該包中的函數式接口如下:d6fcb02eb2ab4f5c822183316591bfde.png

對于 Java8 中提供的這么多函數式接口,開發中常用的函數式接口有以下幾個 Predicate,Consumer,Function,Supplier。

二、函數式接口實例

2.1 Predicate

java.util.function.Predicate接口定義了一個名叫 test 的抽象方法,它接受泛型 T 對象,并返回一個 boolean 值。在對類型 T 進行斷言判斷時,可以使用這個接口。通常稱為斷言型接口 。「字符串判空」

Predicate?p01=(str)->str.isEmpty()||str.trim().isEmpty();

/**

*?測試傳入的字符串是否為空

*/

System.out.println(p01.test(""));

System.out.println(p01.test("?"));

System.out.println(p01.test("admin"));「用戶合法性校驗」

接口靜態方法完成手機號合法校驗功能,方法返回函數式接口 Predicate

public?interface?MyStringInter{

public?final??String?checkPhone=?"^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(16[0-9])"?+

"|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$";

/**

*?用戶手機格式合法性

*?????返回L函數式接口Predicate?的實現?Lambda表達式

*?@return

*/

static?Predicate?checkPhone(){

return?(e)->?{

return?Pattern.compile(checkPhone).matcher(e).matches();

};

}

}

2.2 Consumer

java.util.function.Consumer接口定義了一個名叫 accept 的抽象方法,它接受泛型 T,沒有返回值(void)。如果需要訪問類型 T 的對象,并對其執行某些操作,可以使用這個接口,通常稱為消費型接口。「熱銷商品展示」

/**

熱銷商品測試數據

*/

Goods?g01=new?Goods(1,"iPad?2018款",3000,180,?BigDecimal.valueOf(2300));

Goods?g02=new?Goods(6,"小米平板4",5000,600,?BigDecimal.valueOf(1900));

Goods?g03=new?Goods(9,"微軟?Surface?Pro?6",100,50,?BigDecimal.valueOf(8500));

Goods?g04=new?Goods(20,"華為?榮耀平板5",1600,480,?BigDecimal.valueOf(1500));

List?goods=?Arrays.asList(g01,g02,g03,g04);

//Consumer?實現集合數據輸出?Lambda替代匿名函數?實現Consumer接口

goods.forEach(g->{

System.out.println(g);

});

2.3 Function

java.util.function.Function 接口定義了一個叫作 apply 的方法,它接受一個泛型 T 的對象,并返回一個泛型 R 的對象。如果需要定義一個 Lambda,將輸入的信息映射到輸出,可以使用這個接口(比如提取蘋果的重量,或把字符串映射為它的長度),通常稱為功能型接口。「用戶密碼 Base64 編碼」

//?實現用戶密碼?Base64加密操作

Function?f01=(password)->Base64.getEncoder().encodeToString(password.getBytes());

//?輸出加密后的字符串

System.out.println(f01.apply("123456"));

2.4 Supplier

java.util.function.Supplier接口定義了一個 get 的抽象方法,它沒有參數,返回一個泛型T的對象,這類似于一個工廠方法,通常稱為功能型接口。「外部Properties文件讀取」

public?static?Properties?readFile(String?fileName){

Supplier?supplier?=?()?->?{

try?{

InputStream?is?=?TestCase04.class.getClassLoader().getResourceAsStream(fileName);

Properties?prop?=?new?Properties();

prop.load(is);

return?prop;

}?catch?(IOException?e)?{

e.printStackTrace();

return?null;

}

};

return?supplier.get();

}

三、高階函數bd73603bc56f740be64cf8cb300397fd.png

Java8 中函數式接口中方法允許函數接口作為方法形參傳入,同時方法的結果為函數接口,從而實現鏈式調用操作,就像俄羅斯套娃那樣,當把套娃一個個打開時,發現還有一個同樣的小套娃在里面,最終發現最里面的一個也是一個完整的套娃玩具,此時的高階函數是不是跟套娃有著驚人的相似之處呢。「多頁面轉發」

String?action?=?"";

Predicate?p01?=?(a)?->?StringUtils.isBlank(a);

/**

*?如果action?為空?或?index?或?main?轉發到網站主頁面

*?鏈式判斷?方法結果仍然為一個函數

*/

if?(p01.or((a)?->?a.equals("index")).or((a)?->?a.equals("main")).test(action))?{

System.out.println("網站主頁面...");

}?else?{

System.out.println("其他頁面...");

}「多條件排序」

這里以商品數據為例,按商品銷量、評論排序,如果銷量一致按照商品評論數排序

/**

*?實際開發數據通常從數據庫獲取

*?這里使用測試數據

*/

Goods?g01=new?Goods(1,"小米9",1789,200,?BigDecimal.valueOf(2500));

Goods?g02=new?Goods(2,"華為Mate20",5000,3000,?BigDecimal.valueOf(7000));

Goods?g03=new?Goods(3,"OPPO?R17",2000,2827,?BigDecimal.valueOf(1500));

Goods?g04=new?Goods(4,"魅族?Note9",2000,1600,?BigDecimal.valueOf(1600));

Goods?g05=new?Goods(5,"一加6T",8000,5000,?BigDecimal.valueOf(3500));

List?goods=?Arrays.asList(g01,g02,g03,g04,g05);

//?銷量?與?評論排序?高階函數使用

Comparator?comparator?=?(g1,g2)->g1.getSale()-g2.getSale();

goods.sort(comparator.thenComparing(Comparator.comparing(g3?->?g3.getComment())));

goods.forEach((g)->System.out.println(g));

高階函數應用場景較多(這里查看源碼相關高階函數方法),如 Optinal 接口 filter、map 、orElseGet 等方法,Stream 流操作等基本都會用到 Predicate, Consumer, Supplier, Function 等接口。

四、函數式接口優勢與應用場景

函數式接口的引入,結合 Lambda 的使用,消除的匿名函數繁瑣的代碼,使得代碼結構簡潔、緊湊,第二點就是函數式接口中使用高階函數,可以很方便的實現鏈式調用,代碼清晰簡潔,同時引入的一種新的開發思想-函數式編程,對于開發者來說只需要關注函數的規則設計實現即可。

對于函數式接口應用,后續介紹到的 Optinal、Stream 相關方法對于數據處理的使用頻率較高,同時也是構成函數式編程的核心內容。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532347.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532347.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532347.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java jvm內存地址_JVM--Java內存區域

Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域,如圖:1.程序計數器可以看作是當前線程所執行的字節碼的行號指示器,通俗的講就是用來指示執行哪條指令的。為了線程切換后能恢復到正確的執行位置Java多線程是…

java情人節_情人節寫給女朋友Java Swing代碼程序

馬上又要到情人節了,再不解風情的人也得向女友表示表示。作為一個程序員,示愛的時候自然也要用我們自己的方式。這里給大家上傳一段我在今年情人節的時候寫給女朋友的一段簡單的Java Swing代碼,主要定義了一個對話框,讓女友選擇是…

java web filter鏈_filter過濾鏈:Filter鏈是如何構建的?

在一個Web應用程序中可以注冊多個Filter程序,每個Filter程序都可以針對某一個URL進行攔截。如果多個Filter程序都對同一個URL進行攔截,那么這些Filter就會組成一個Filter鏈(也叫過濾器鏈)。Filter鏈用FilterChain對象來表示,FilterChain對象中…

java web 應用技術與案例教程_《Java Web應用開發技術與案例教程》怎么樣_目錄_pdf在線閱讀 - 課課家教育...

出版說明前言第1章 java Web應用開發技術概述1.1 Java Web應用開發技術簡介1.1.1 Java Web應用1.1.2 Java Web應用開發技術1.2 Java Web開發環境及開發工具1.2.1 JDK的下載與安裝1.2.2 Tomcat服務器的安裝和配置1.2.3 MyEclipse集成開發工具的安裝與操作1.3 Java Web應用程序的…

java環境變量自動設置_自動設置Java環境變量

echo offSETLOCALENABLEDELAYEDEXPANSIONfor /f "tokens2* delims " %%i in(reg query "HKLM\Software\JavaSoft\Java Development Kit" /s ^|find /I"JavaHome") do (echo 找到目錄 %%jset /p isOK該目錄是不是JDK^(JavaDevelopment Kit^)的安裝…

mysql運行狀態監控研究內容_如何監控mysql主從的運行狀態shell腳本實例介紹

如何監控mysql主從的運行狀態shell腳本實例介紹。#!/bin/bash#define mysql variablemysql_user”root”mysql_pass”123456″email_addr”slavecentos.bz”mysql_statusnetstat -nl | awk ‘NR>2{if ($4 ~ /.*:3306/) {print “Yes”;exit 0}}’if [ "$mysql_status&q…

java 100% cpu_Java服務,CPU 100%問題如何快速定位?

Java服務,有時候會遇到CPU 100%的問題,對于這樣的問題,我們如何快速定位并解決呢?一般會有如下三個步驟:1、找到最耗CPU的進程2、找到這個進程中最耗CPU的線程3、查看堆棧信息,定位線程的什么操作消耗了大量…

java 泛型 加_Java泛型并將數字加在一起

為了一般地計算總和,您需要提供兩個動作:>一種總計零項的方法>一種總結兩個項目的方法在Java中,您可以通過界面完成.這是一個完整的例子:import java.util.*;interface adder {T zero(); // Adding zero itemsT add(T lhs, T rhs); // Adding two …

java 字母金字塔_LeetCode756:金字塔轉換矩陣(JAVA題解)

題目描述現在,我們用一些方塊來堆砌一個金字塔。 每個方塊用僅包含一個字母的字符串表示。使用三元組表示金字塔的堆砌規則如下:對于三元組(A, B, C) ,“C”為頂層方塊,方塊“A”、“B”分別作為方塊“C”下一層的的左、右子塊。當…

java final static_Java基礎之final、static關鍵字

一、前言關于這兩個關鍵字,應該是在開發工作中比較常見的,使用頻率上來說也比較高。接口中、常量、靜態方法等等。但是,使用頻繁卻不代表一定是能夠清晰明白的了解,能說出個子丑演卯來。下面,對這兩個關鍵字的常見用法…

docker mysql57_docker安裝mysql57

提高應用交付效率mysql1. 支持服務發現,避免服務重啟遷移 IP 變動帶來影響;2. 支持微服務化,下降代碼維護及重構復雜度,適應快速變化的業務需求。sql快速響應業務變化docker1. 靈活水平擴展,應對業務量的驟然變化&…

java刪除csv一行_在Java中讀取CSV文件時跳過第一行

嘿家伙我正在編寫解析器代碼來讀取.csv文件并將其解析為XML.這是我的代碼,它工作正常,但我希望它跳過文件中的第一行.所以我決定設置一個HashMap,但它似乎確實有效&#xff1a;for (int i 0; i < listOfFiles.length; i) {File file listOfFiles[i];if (file.isFile() &am…

java語言錯誤的是解釋運行的_Java基礎知識測試__A卷_答案

考試宣言:同學們, 考試考多少分不是我們的目的! 排在班級多少的名次也不是我們的初衷!我的考試的目的是要通過考試中的題目,檢查大家在這段時間的學習中,是否已經把需要掌握的知識掌握住了,如果哪道題目你不會做,又或者做錯了, 那么不用怕, 考完試后, 導師講解的時候你要注意聽…

java 持續集成工具_Jenkins-Jenkins(持續集成工具)下載 v2.249.2官方版--pc6下載站

Jenkins是一款基于java開發的持續集成工具&#xff0c;是一款開源軟件&#xff0c;主要用于監控持續重復的工作&#xff0c;為開發者提供一個開發易用的軟件平臺&#xff0c;使軟件的持續集成變成可能。。相關軟件軟件大小版本說明下載地址Jenkins是一款基于java開發的持續集成…

java中number類型能否相除_Java中 如果復數類成員是int型,怎么實現兩個復數相除...

(1) 復數類Complex 的屬性有&#xff1a;RealPart : int型&#xff0c;代表復數的實數部分ImaginPart : int型&#xff0c;代表復數的虛數部分package applet;import java.applet.*;import java.awt.*;public class j_1 extends Applet{Complex a,b,c,d,e,f;public void in…

java中線程調度遵循的原則_深入理解Java多線程核心知識:跳槽面試必備

多線程相對于其他 Java 知識點來講&#xff0c;有一定的學習門檻&#xff0c;并且了解起來比較費勁。在平時工作中如若使用不當會出現數據錯亂、執行效率低(還不如單線程去運行)或者死鎖程序掛掉等等問題&#xff0c;所以掌握了解多線程至關重要。本文從基礎概念開始到最后的并…

java禁止js獲取cookie_java中Cookie被禁用后Session追蹤問題

一.服務器端獲取Session對象依賴于客戶端攜帶的Cookie中的JSESSIONID數據。如果用戶把瀏覽器的隱私級別調到最高&#xff0c;這時瀏覽器是不會接受Cookie、這樣導致永遠在服務器端都拿不到的JSESSIONID信息。這樣就導致服務器端的Session使用不了。Java針對Cookie禁用&#xff…

java類構造方法成員方法練習_面向對象方法論總結 練習(一)

原標題&#xff1a;面向對象方法論總結 & 練習(一)學習目標1.面向對象與面向過程2.類與對象的概念3.類的定義&#xff0c;對象的創建和使用4.封裝5.構造方法6.方法的重載內容1.面向對象與面向過程為什么會出現面向對象反分析方法&#xff1f;因為現實世界太復雜多變&#x…

mysql 統計查詢不充電_MySql查詢語句介紹,單表查詢,來充電吧

mysql在網站開發中&#xff0c;越來越多人使用了&#xff0c;方便部署&#xff0c;方便使用。我們要掌握mysql,首先要學習查詢語句。查詢單個表的數據&#xff0c;和多個表的聯合查詢。下面以一些例子來先簡單介紹下單表查詢。操作方法01首先看下我們例子用到的數據表&#xff…

MySQL線上優化_線上MySQL千萬級大表,如何優化?

前段時間應急群有客服反饋&#xff0c;會員管理功能無法按到店時間、到店次數、消費金額進行排序。經過排查發現是 SQL 執行效率低&#xff0c;并且索引效率低下。圖片來自 Pexels應急問題商戶反饋會員管理功能無法按到店時間、到店次數、消費金額進行排序&#xff0c;一直轉圈…