Java8新特性——函數式接口

目錄

一、介紹

二、示例

(一)Consumer?

源碼解析

測試示例?

(二)Comparator

(三)Predicate

三、應用

四、總結?


一、介紹

@FunctionalInterface是一種信息注解類型,用于指明接口類型聲明成為Java語言規范定義的函數式接口。從概念上說,函數式接口只有一個抽象方法,因為默認方法有一個實現,所以他們不是抽象的。如果一個接口聲明了一個抽象方法覆蓋java.lang的一個公共方法,這也不計入接口的抽象方法計數,因為接口的任何實現都將有來自java.lang.Object或其他地方的實現。函數式接口的實例可以使用lambda表達式、方法引用或構造函數引用來創建。


二、示例

(一)Consumer<T>?

(消費者)表示一個接受單個輸入參數并且不返回結果的操作。

源碼解析

accept()方法接收一個參數,并對該參數執行特定的操作,沒有返回值

addThen()方法接受一個consumer類型的對象,它將一個consumer對象與另一個consumer對象進行關聯,該方法會返回一個新的consumer對象,它首先執行當前consumer的accept()方法,然后再執行傳入的after consumer對象的accpet()方法。

@FunctionalInterface
public interface Consumer<T> {/*** Performs this operation on the given argument.** @param t the input argument*/void accept(T t);/*** Returns a composed {@code Consumer} that performs, in sequence, this* operation followed by the {@code after} operation. If performing either* operation throws an exception, it is relayed to the caller of the* composed operation.  If performing this operation throws an exception,* the {@code after} operation will not be performed.** @param after the operation to perform after this operation* @return a composed {@code Consumer} that performs in sequence this* operation followed by the {@code after} operation* @throws NullPointerException if {@code after} is null*/default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}
}

測試示例?

public class ConsumerTest {public static void main(String[] args) {Consumer<String> printUpperCase = s -> System.out.println(s.toUpperCase());Consumer<String> printLength = s -> System.out.println(s.length());Consumer<String> combine = printUpperCase.andThen(printLength);List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Jim");names.forEach(printUpperCase);names.forEach(combine);}
}

(二)Comparator<T>

(比較器)compare方法是Comparator接口中的方法,它用于比較兩個對象的大小。一般來說,如果第一個對象小于第二個對象,則返回負整數;如果第一個對象等于第二個對象,則返回零;如果第一個對象大于第二個對象,則返回正整數。

public class ComparatorTest {public static void main(String[] args) {// 自定義比較器,實現compare方法,比較規則是自然數降序排列CustomedComparator customedComparator = new CustomedComparator();List<Integer> list = Arrays.asList(5, 8, -2, 0, 10);list.sort(customedComparator);// forEach函數傳入一個consumer對象,底層是加強for循環 + 調用accpet()list.forEach(ele -> System.out.println(ele));}
}

Comparator接口聲明了函數式接口,但接口中聲明了兩個抽象方法,這顯然不符合之前給的定義。首先我先驗證是否注解允許多個抽象方法,驗證得出聲明此注解的接口只能有一個抽象方法。Comparator接口中聲明了equals和compare兩個抽象方法,?其中equals是Object類的公共方法,這里令我不解的是接口中equals方法是聲明的抽象方法,但它卻無需實現,這里需要注意一下。最后,聲明函數式接口只有一個抽象方法這是肯定的。

(三)Predicate<T>

(斷言)predicate<T>代表了一個接受一個參數并返回布爾值結果的判斷條件。該接口中只有一個抽象方法test,用于對給定的參數進行判斷,并返回一個布爾值。

public class PredicateTest {public static void main(String[] args) {Predicate<Integer> predicate = num -> num % 2 == 0;System.out.println(predicate.test(11));System.out.println(predicate.test(0));}
}

三、應用

  1. forEach方法,迭代器方法,參數是consumer對象。
  2. Arrays.sort()方法,傳入comparator對象,自定義比較
  3. Stream流操作
  4. lambda表達式

四、總結?

? 函數式接口是JDK8的新特性,在函數式接口使用ambda表達式會使代碼更加簡潔,上述內容如果有錯誤的地方,希望大佬們可以指正。我一直在學習的路上,您的幫助使我收獲更大!覺得對您有幫助的話,還請點贊支持!我也會不斷更新文章!

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

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

相關文章

CSS3筆記之基礎篇(一)邊框

效果一、圓角效果 border-radius 實心上半圓&#xff1a; 方法&#xff1a;把高度(height)設為寬度&#xff08;width&#xff09;的一半&#xff0c;并且只設置左上角和右上角的半徑與元素的高度一致&#xff08;大于也是可以的&#xff09;。 div {height:50px;/*是width…

JavaSE之Java基礎(1)

1、為什么重寫equals還要重寫hashcode 首先equals與hashcode間的關系是這樣的&#xff1a; 1、如果兩個對象相同&#xff08;即用equals比較返回true&#xff09;&#xff0c;那么它們的hashCode值一定要相同&#xff1b; 2、如果兩個對象的hashCode相同&#xff0c;它們并不一…

bootstarp table

https://www.cnblogs.com/laowangc/p/8875526.html

高級組件——彈出式菜單JPopupMenu

彈出式菜單JPopupMenu&#xff0c;需要用到鼠標事件。MouseListener必須要實現所有接口&#xff0c;MouseAdapter是類&#xff0c;只寫你關心的方法&#xff0c;即MouseAdapter實現了MouseListener中的方法 import javax.swing.*; import java.awt.*; import java.awt.event.Mo…

CSS3筆記之基礎篇(二)顏色和漸變色彩

效果一、顏色之RGBA RGB是一種色彩標準&#xff0c;是由紅(R)、綠(G)、藍(B)的變化以及相互疊加來得到各式各樣的顏色。RGBA是在RGB的基礎上增加了控制alpha透明度的參數。 語法&#xff1a; color&#xff1a;rgba(R,G,B,A) 以上R、G、B三個參數&#xff0c;正整數值的取值…

19_03_26校內訓練[魔法卡片]

題意 有n張有序的卡片&#xff0c;每張卡片上恰有[1,m]中的每一個數&#xff0c;數字寫在正面或反面。每次詢問區間[l,r]&#xff0c;你可以將卡片上下顛倒&#xff0c;問區間中數字在卡片上方的并的平方和最大是多少。q,n*m≤1,000,000。 思考 一個很重要的性質&#xff0c;若…

vue 靜態圖片引入

https://blog.csdn.net/weixin_33862188/article/details/93325502

c:if test=/c:if 使用

1、頁面引用<%taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c"%> 2、整形判斷&#xff1a; <c:if test"${TEST 1}"> </c:if> 3、判斷非空&#xff1a; <c:if test"${empty TEST}"> TEST為空 <…

CSS3筆記之基礎篇(三)文字與字體

要點一、text-overflow與word-wrap text-overflow&#xff1a;設置是否使用一個省略標記&#xff08;...&#xff09;標示對象內文本的溢出。 word-wrap&#xff1a;設置文本行為&#xff0c;當前行超過指定容器的邊界時是否斷開轉行。 語法如下&#xff1a; 注意&#xff1…

XV6操作系統代碼閱讀心得(二):進程

1. 進程的基本概念 從抽象的意義來說&#xff0c;進程是指一個正在運行的程序的實例&#xff0c;而線程是一個CPU指令執行流的最小單位。進程是操作系統資源分配的最小單位&#xff0c;線程是操作系統中調度的最小單位。從實現的角度上講&#xff0c;XV6系統中只實現了進程&…

webservices

https://blog.csdn.net/VitaminZH/article/details/81123571

.Net Core 商城微服務項目系列(十二):使用k8s部署商城服務

一、簡介 本篇我們將會把商城的服務部署到k8s中&#xff0c;同時變化的還有以下兩個地方&#xff1a; 1.不再使用Consul做服務的注冊和發現&#xff0c;轉而使用k8s-dns來實現。 2.不再使用Ocelot作為業務網關&#xff0c;使用Traefik來實現。 正如上面所講&#xff0c;服務發現…

HTML、CSS知識點總結,淺顯易懂。

一&#xff0c;htmlcss基礎 1-1 Html和CSS的關系 學習web前端開發基礎技術需要掌握&#xff1a;HTML、CSS、JavaScript語言。下面我們就來了解下這三門技術都是用來實現什么的&#xff1a; 1. HTML是網頁內容的載體。內容就是網頁制作者放在頁面上想要讓用戶瀏覽的信息&#xf…

Thinking in Java 源代碼 source code 在IDEA上運行

參考我52的文章&#xff1a;https://www.52pojie.cn/thread-912471-1-1.html 轉載于:https://www.cnblogs.com/AI-Cobe/p/10605434.html

CSS知識體系圖譜

轉自&#xff1a;https://blog.csdn.net/A13330069275/article/details/78448415

python2 pip安裝包等出現各種編碼錯誤UnicodeDecodeError: 'ascii'(/或者utf-8) codec can't decode byte 0xd2......

1.問題描述&#xff1a; python2環境&#xff0c;pip安裝包時報錯UnicodeDecodeError: ascii(/或者utf-8) codec cant decode byte 0xd2... 類似如下情況 2.原因分析 一開始依據網上給出的教程修改python安裝路徑下的各種文件&#xff0c;添加各種編碼&#xff0c;始終無法解決…

mybatis自動生成代碼

https://blog.csdn.net/qq_31169429/article/details/89137896

leetcood學習筆記-111-二叉樹的最小深度

題目描述&#xff1a; 第一次提交&#xff1a; class Solution(object):def minDepth(self, root):""":type root: TreeNode:rtype: int"""if not root:return 0if root.left and root.right:return min(self.minDepth(root.left)1,self.minDept…

深入淺析HTML5中的article和section的區別

在HTML5中&#xff0c;為了使文檔的結構更加清晰明確&#xff0c;追加了幾個與頁眉、頁腳、內容區塊等文檔結構相關聯的結構元素。內容區塊是指將HTML頁面按邏輯分割后 的單位。例如對于書籍來說&#xff0c;章、節可以稱為內容區塊&#xff1b;對于博客網站來說&#xff0c;導…

IPV6 簡單總結

1. 轉帖別人的內容 來源&#xff1a;https://www.2cto.com/net/201112/114937.html 2. 本地用IPV6單播地址 (包括鏈路本地單播地址 和 站點本地單播地址) 2.1 鏈路本地單播地址 規定了鏈路本地和站點本地兩種類型的本地使用單播地址。鏈路本地地址用在單鏈路上&#xff0c; 而…