Java中Predicate(謂詞),方法引用,以及正則的一些講解

1.Predicate接口簡述

@FunctionalInterface
public interface Predicate<T> {boolean test(T t);default Predicate<T> and(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> test(t) && other.test(t);}default Predicate<T> negate() {return (t) -> !test(t);}default Predicate<T> or(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> test(t) || other.test(t);}static <T> Predicate<T> isEqual(Object targetRef) {return (null == targetRef)? Objects::isNull: object -> targetRef.equals(object);}
}
  • Predicate接口使用了注解@FunctionalInterface,表示該接口只包含一個抽象方法,可以被當做函數式接口使用
  • 該接口定義了一個抽象方法test,表示一個參數的布爾判斷。這使得 Predicate 非常適用于過濾操作
  • 該接口還提供了and()、or()、negate()默認方法來進行復合使用,分別表示與、或、非的含義

2.Predicate功能:過濾后保留符合條件的元素

filter()函數接收一個Predicate類型的參數,用于過濾。這是filter的簽名:

public interface Stream<T> extends BaseStream<T, Stream<T>> {...Stream<T> filter(Predicate<? super T> predicate);...
}

下面是Predicate的使用實例,使用 Predicate 過濾非空且非空字符串的名稱:

List<String> names = Arrays.asList("Alice", "Bob", "", "Charlie", null, "David");List<String> filteredNames = names.stream().filter(Objects::nonNull)             // 使用方法引用檢查非空.filter(name -> !name.isEmpty())      // 使用 lambda 表達式檢查非空字符串.filter(((Predicate<String>) s -> s.length() <= 3).or(s -> s.length() >= 7))  //復合使用Predicate.collect(Collectors.toList());  //收集所有通過過濾的元素
System.out.println("輸出最終結果: " + filteredNames);//日志log:
輸出最終結果: [Bob, Charlie]

3.分析上面的 Objects::nonNull

  • Predicate 是一個函數式接口,它定義了一個抽象方法boolean test(T t)。這意味著任何具有相同參數和返回類型的方法都可以用作Predicate 類型的實例
  • Objects.nonNull(Object obj) 是一個靜態方法,它接受一個 Object 類型的參數,并返回一個 boolean 值。如果傳入的對象不是 null,它返回 true;否則返回 false。因為它的簽名(接受一個參數并返回一個布爾值)與 Predicate 接口的 test 方法相匹配,因此該方法可以被視為實現了 Predicate 接口的一個實例
public final class Objects {...public static boolean nonNull(Object obj) {return obj != null;}...
}
  • Objects::nonNull 這里雙冒號 :: 是方法引用,這是 Java 8 引入的一種簡化 lambda 表達式的方式,用于提供一種更簡潔、更清晰的編碼風格。

4.正則表達式模式轉Predicate

可以將一個正則表達式Pattern,轉為Predicate,這樣子可以在Stream利用該Predicate來進行過濾,本質上是調用Matcher.find()

Pattern-> 
public Predicate<String> asPredicate()  //將正則表達式模式轉換為一個謂詞(Predicate),本質上是Matcher.find()

使用:

//過濾得到包含數字的字符串
public static List<String> filterContainsNumber(List<String> inputStrList) {Pattern pattern = Pattern.compile("\\d");  //包含數字Predicate<String> predicate = pattern.asPredicate();  //將一個正則表達式模式轉換為一個謂詞(Predicate),本質是Matcher.find()List<String> filteredStrings = inputStrList.stream()  //先將List轉為流.filter(predicate)  //只留下包含數字字符串.collect(Collectors.toList());return filteredStrings;
}//調用
List<String> list = Arrays.asList("apple", "banana1", "orange2", "grape", "melon3");
System.out.println("過濾得到包含數字的字符串: " + filterContainsNumber(list));//log日志
過濾得到包含數字的字符串: [banana1, orange2, melon3]

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

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

相關文章

速盾:cdn加速效果

CDN&#xff08;Content Delivery Network&#xff09;即內容分發網絡&#xff0c;是一種通過在全球多個節點服務器上緩存網站的靜態資源&#xff0c;并將用戶請求導向離用戶最近的服務器節點&#xff0c;從而提供更快速的訪問體驗的技術。 在傳統的網絡架構中&#xff0c;用戶…

鴻蒙 HarmonyOs 網絡請求 快速入門

官方文檔&#xff1a; ArkUI簡介-ArkUI&#xff08;方舟UI框架&#xff09;-應用框架 | 華為開發者聯盟 (huawei.com) 一、通過原有的http組件進行網絡請求&#xff08;方式一&#xff09; 1.1 HttpRequestOptions的操作 名稱類型描述methodRequestMethod請求方式&#xff…

12款超良心好用APP推薦,每一款都值得下載!

AI視頻生成&#xff1a;小說文案智能分鏡智能識別角色和場景批量Ai繪圖自動配音添加音樂一鍵合成視頻https://aitools.jurilu.com/分享是奉獻的果實&#xff0c;分享是快樂的前提。每天給小伙伴們分享自己認可的軟件&#xff0c;也是莫大的幸福&#xff0c;今天獲得12款好用的軟…

class類和style內聯樣式的綁定

這里的綁定其實就是v-bind的綁定&#xff0c;如代碼所示&#xff0c;div后面的引號就是v-bind綁定&#xff0c;然后大括號將整個對象括起來&#xff0c;對象內先是屬性&#xff0c;屬性后接的是變量&#xff0c;這個變量是定義在script中的&#xff0c;后通過這個變量&#xff…

flutter:監聽路由的變化

問題 當從路由B頁面返回路由A頁面后&#xff0c;A頁面需要進行數據刷新。因此需要監聽路由變化 解決 使用RouteObserver進行錄音監聽 創建全局變量&#xff0c;不在任何類中 final RouteObserver<PageRoute> routeObserver RouteObserver<PageRoute>();在mai…

flask-apscheduler 定時任務被執行兩次

定時任務沒有被多次調用&#xff0c;事實上如果多次調用的話&#xff0c;flask-apscheduler會拋出異常。 但一開始任務還是按時執行一次&#xff0c;重啟flask或者修改部分代碼后&#xff0c;就發送定時任務一次執行兩次了。 之所以會發生這種情況&#xff0c;是因為在debug模…

面試-微服務篇

springcloud組件有哪些&#xff1f; eureka、ribbon負載均衡、feign、hystrix、zuul/gateway網關 nacos、ribbon、feign、sentinel、gateway 服務注冊和發現是什么意思&#xff1f;springcloud如何實現服務注冊發現&#xff1f; 微服務中必須要使用的組件&#xff0c;考察我們使…

LeetCode刷題記錄:(15)三角形最小路徑和

知識點&#xff1a;倒敘的動態規劃 題目傳送 解法一&#xff1a;二維動態規劃【容易理解】 class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n triangle.size();if (n 1) {return triangle.get(0).get(0);}// dp[i][j]:走到第i層第…

[240705] 美光或將助力英偉達 RTX 50系列領先 AMD | 中國領跑生成式人工智能專利競賽

目錄 美光或將助力英偉達 RTX 50系列領先 AMD中國領跑生成式人工智能專利競賽 美光或將助力英偉達 RTX 50系列領先 AMD &#x1f4e2; 美光近日公布了其下一代顯存 GDDR7 的性能數據&#xff0c;顯示出在游戲性能方面高達30%的提升&#xff0c;這對于即將推出的顯卡來說無疑是…

白騎士的C語言教學基礎篇 1.2 C語言基礎語法

系列目錄 上一篇&#xff1a;白騎士的C語言教學基礎篇 1.1 C語言介紹 在這一篇內容中&#xff0c;我們將介紹C語言的基礎語法&#xff0c;包括C語言的程序結構、數據類型與變量、常量與運算符。 C語言程序結構 C語言程序的基本結構包括頭文件、主函數和語句。一個簡單的C語言…

Java+前后端分離架構+ MySQL8.0.36產科信息管理系統 產科電子病歷系統源碼

Java前后端分離架構 MySQL8.0.36產科信息管理系統 產科電子病歷系統源碼 產科信息管理系統—住院管理 數字化產科住院管理是現代醫院管理中的重要組成部分&#xff0c;它利用數字化技術優化住院流程&#xff0c;提升醫療服務質量和效率。以下是對數字化產科住院管理的詳細闡述…

【Spring Boot】統一異常處理

目錄 統一異常處理一. 概念二. 全局異常處理三. 處理特定異常 統一異常處理 一. 概念 其實統一異常是運用了AOP&#xff08;對某一類事情的集中處理&#xff09;的思維&#xff0c;簡單概括就是在我們進行前后端數據交互的時候&#xff0c;拋出的任何的異常都能夠自動捕獲然后…

uniapp微信接口回調 response.sendRedirect nginx 報404錯誤

如題 參考 uniapp打包H5時,訪問index.html頁面白屏報錯net::ERR_ABORTED 404 - 簡書 nginx中修改 配置文件 location / { try_files $uri $uri/ /index.html; root html; index index.html index.htm; } uniapp里配置 重新載入

JavaScript常用包管理工具

NPM、Yarn、CNPM 和 PNPM 是 JavaScript 生態系統中常用的包管理工具。它們各自有不同的特點和優勢。以下是對它們的詳細解釋&#xff1a; 1. NPM (Node Package Manager) 簡介&#xff1a; NPM 是 Node.js 的默認包管理工具&#xff0c;也是最早出現的 JavaScript 包管理工具…

ingress-nginx控制器證書不會自動更新問題

好久沒更新了&#xff0c;正好今天遇到了一個很有意思的問題&#xff0c;在這里給大家分享下&#xff0c;同時也做下記錄。 背景 最近想做個實驗&#xff0c;當k8s集群中secret更新后&#xff0c;ingress-nginx控制器會不會自動加載新的證書。我用通義千問搜了下&#xff0c;…

什么是FPGA的基本組成單元?

FPGA&#xff08;Field-Programmable Gate Array&#xff09;的基本組成單元是其內部結構的關鍵組件&#xff0c;這些單元可以被編程來執行各種數字邏輯功能。FPGA的基本組成單元主要包括以下幾個部分&#xff1a; 可編程邏輯塊 (CLB, Configurable Logic Block) CLB是FPGA中最…

Airflow: 大數據調度工具詳解

歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;歡迎訂閱相關專欄&#xff1a; 歡迎關注微信公眾號&#xff1a;野老雜談 ?? 全網最全IT互聯網公司面試寶典&#xff1a;收集整理全網各大IT互聯網公司技術、項目、HR面試真題. ?? AIGC時代的創新與未來&a…

【CH32V305FBP6】移植 RT-Thread

文章目錄 前言實現修改鏈接文件移植 RTT 代碼修改啟動文件修改中斷文件修改主文件 前言 移植 RT-Thread 到 CH32V305FBP6。 實現 修改鏈接文件 .text :{. ALIGN(4);*(.text)*(.text.*)*(.rodata)*(.rodata*)*(.gnu.linkonce.t.*)/* section information for finsh shell */…

Go單元測試

Go 語言中&#xff0c;單元測試是通過標準庫中的 testing 包來實現的&#xff0c;該包提供了一組功能&#xff0c;使得編寫、運行和管理單元測試變得簡單和高效。 一、規則 測試文件的命名規則 Go 中的測試文件命名規則是在被測試的源文件名后面加上 _test.go。例如&#xff0…

matplotlib下載安裝

matplotlib下載安裝過程同之前寫的pygame很類似。 Pygame下載安裝 python官網 1.搜索matplotlib 直接點進去 查看歷史版本&#xff0c;因為新版本可能出現與python不匹配問題。 我選擇3.6.3版本&#xff0c;因為我安裝的python是3.8&#xff0c;可以匹配版本。同時window操…