Java Lambda 類型推斷詳解:filter() 方法與 Predicate<? super T>

一、問題核心解析

1. 代碼示例分析

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()) .collect(Collectors.toList());

2. Lambda 表達式為什么能傳入

  • 函數式接口本質:Lambda 表達式是函數式接口的實例化簡寫

  • Predicate<T>?是函數式接口,只有一個抽象方法:

    @FunctionalInterface
    public interface Predicate<T> {boolean test(T t); // 唯一的抽象方法// 其他默認方法...
    }
  • Lambda 表達式?string -> !string.isEmpty()?等價于:

    new Predicate<String>() {@Overridepublic boolean test(String string) {return !string.isEmpty();}
    }

3.?<? super T>?的含義

  • 下界通配符:表示接受?T?或?T?的父類型

  • 在?filter(Predicate<? super T> predicate)?中:

    • T?是流元素的類型(本例中是?String

    • ? super T?表示可以接受處理?String?或其父類(如?Object,?CharSequence)的?Predicate

二、類型推斷全流程

1. 類型推斷步驟

2. 詳細推斷過程

步驟 1:流類型確定
strings.stream() // 返回 Stream<String>
  • 編譯器從?strings?的類型?List<String>?推斷出?stream()?返回?Stream<String>

  • 此時?T = String

步驟 2:filter 方法簽名匹配
Stream<T> filter(Predicate<? super T> predicate);
// 代入 T=String → 
Stream<String> filter(Predicate<? super String> predicate);
步驟 3:Lambda 表達式類型解析
.filter(string -> !string.isEmpty())
  • 目標類型Predicate<? super String>

  • 參數類型推斷

    • 根據目標類型,string?必須是?String?或其父類

    • Lambda 體中使用?string.isEmpty()?方法

    • isEmpty()?是?String?類的方法(在?CharSequence?中不存在)

    • 因此編譯器推斷?string?必須是?String?類型

步驟 4:返回值類型推斷
  • Lambda 體?!string.isEmpty()?返回?boolean

  • 匹配?Predicate.test()?要求的?boolean?返回類型

步驟 5:完整匹配驗證
// 等效實現
Predicate<String> p = (String s) -> {return !s.isEmpty();
};
filter(p); // 符合 Predicate<? super String>

三、<? super T>?的設計意義

1. 提高 API 靈活性

// 通用謂詞:處理任何對象
Predicate<Object> nonNull = obj -> obj != null;// 可用于不同類型的流
List<String> strings = ...;
strings.stream().filter(nonNull); // 允許:Object 是 String 的父類List<Integer> numbers = ...;
numbers.stream().filter(nonNull); // 允許:Object 是 Integer 的父類

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

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

相關文章

XSS:xss.haozi.me靶場練習

超鏈接:alert(1) 知識點: html <&#xff01;--被注釋的內容--> <&#xff01;--被注釋的內容!--> php /*被注釋的內容*/ //被注釋的內容 javascript /*被注釋的內容*/ //被注釋的內容 MySQL …

ubuntu 20.04 安裝中文輸入法 (sougou pin yin)

安裝搜狗輸入法包 參照官方指南完成 如果提示沒有找到相關依賴&#xff0c;添加一下源&#xff1a; sudo add-apt-repository universe sudo apt update重啟。

(DETR)End-to-End Object Detection with Transformers論文精讀(逐段解析)

(DETR)End-to-End Object Detection with Transformers論文精讀&#xff08;逐段解析&#xff09; 論文地址&#xff1a;https://arxiv.org/abs/2005.12872 CVPR 2020 Facebook AI 發布 Abstract. We present a new method that views object detection as a direct set pred…

[linux][shell]通過分析 Nginx 的訪問日志,檢測異常 IP 地址并使用iptables 將其封禁

這段腳本的作用是通過分析 Nginx 的訪問日志&#xff0c;檢測異常的 IP 地址&#xff0c;并使用 iptables 封禁這些 IP。#!/bin/bash# 配置變量 LOG_FILE"/usr/local/nginx/logs/access.log" THRESHOLD10 DROP_LOG_FILE"/tmp/drop_ip.log" DATE$(date &quo…

stm32cube ide如何將工具鏈替換成arm-none-eabi-gcc

在 STM32Cube IDE 中替換工具鏈為GNU Arm Embedded Toolchain (arm-none-eabi-gcc)&#xff0c;可按以下步驟操作&#xff1a; 1. 檢查是否已安裝工具鏈 首先確認系統中是否已安裝 arm-none-eabi-gcc&#xff1a; Windows&#xff1a;檢查環境變量 PATH 中是否包含工具鏈路徑…

Linux 系統 /etc/ 配置

在Linux系統中&#xff0c;/etc/ 目錄是系統配置文件的核心存放位置&#xff0c;包含了各種系統服務、應用程序和硬件的配置信息。以下是該目錄下常見的重要配置文件和子目錄&#xff1a; 核心系統配置文件 /etc/hostname 系統主機名配置&#xff0c;直接決定當前系統的名稱。/…

【跟著PMP學習項目管理】項目管理 之 成本管理知識點

目錄 一、估算成本 1、知識點匯總 2、輸入 3、工具 4、輸出 二、預算成本 1、知識點匯總 2、輸入 3、工具 4、輸出 三、控制成本 1、知識點匯總 2、輸入 3、工具 4、輸出 一、估算成本 1、知識點匯總 1) 估算工具的用法 2、輸入 范圍基準、人力資源計劃、項…

TCP相關實驗

目錄 TCP相關實驗 理解CLOSE_WAIT狀態 理解???TIME_WAIT狀態 解決TIME_WAIT狀態引起的bind失敗的方法 理解listen的第二個參數 ?編輯 使用Wireshark分析TCP通信流程 TCP與UDP TCP與UDP對比 用UDP實現可靠傳輸&#xff08;經典面試題&#xff09; TCP相關實驗 理解…

Spring Boot項目初始化:官方與阿里云服務地址對比指南

服務提供商 官方&#xff08;start.spring.io Spring&#xff09; 官方提供的服務&#xff0c;由Pivotal&#xff08;VMware&#xff09;維護&#xff0c;是標準的初始化工具。 阿里云&#xff08;start.aliyun.com&#xff09; 阿里云提供的國內鏡像服務&#xff0c;針對中國開…

創客匠人創始人IP案例:從個人品牌到企業增長的全鏈路拆解

認知破局&#xff1a;為什么創客匠人創始人IP能撬動企業增長&#xff1f;在知識付費工具競爭同質化的當下&#xff0c;創客匠人創始人老蔣以“IP變現領軍人”的IP形象&#xff0c;為企業打開了差異化增長通道。當同行還在比拼“功能數量”時&#xff0c;老蔣通過《領導者請停止…

UVC(USB Video Class,USB 視頻類)協議

UVC&#xff08;USB Video Class&#xff0c;USB 視頻類&#xff09;協議并非專門僅用于相機&#xff0c;但其核心應用場景集中在視頻采集設備&#xff0c;相機是最典型的代表。其適用設備除了常見的 USB 相機&#xff08;包括 webcam、工業相機、監控攝像頭等&#xff09;&…

如何使用 eBPF 監控 Linux 內存情況:Linux 內存調優之 eBPF 內存監控分析

寫在前面 博文內容整理自 《BPF Performance Tools》 書中 內存部分對書中提到BPF工具配合實際Demo進行說明,以及一些變體的輸出涉及下面一些內存問題的 BPF 觀測 Demo:為什么進程的物理內存占用(RSS)不停增長?哪些代碼路徑會導致缺頁錯誤的發生,缺頁錯誤來自哪些文件?大頁的…

SQL 表結構轉 Go、Java、TS 自定義實體類,支持自編模板

SQL 表結構一鍵轉自定義模型&#xff0c;支持 Golang Template 自由編寫&#xff01; 有沒有想過 —— 一份 SQL 表結構&#xff0c;不止能轉成 Java 實體類、Go struct&#xff0c;甚至可以&#xff1a; ? 一鍵生成 TypeScript 接口? 輸出 Protobuf 定義文件? 輸出任意你…

新型BERT勒索軟件肆虐:多線程攻擊同時針對Windows、Linux及ESXi系統

趨勢科技安全分析師發現&#xff0c;一個代號為BERT&#xff08;內部追蹤名Water Pombero&#xff09;的新型勒索軟件組織正在亞洲、歐洲和美國展開多線程攻擊。該組織主要針對醫療保健、科技和會展服務行業&#xff0c;其活動范圍顯示其正成為勒索軟件生態中的新興威脅力量。攻…

Three.js搭建小米SU7三維汽車實戰(1)搭建開發環境

1.基本概念 ![](https://i-blog.csdnimg.cn/img_convert/a4676122e207e058f3a335df2c99d4f8.png)1) 場景 如何理解場景 場景就是一個三維的世界, 在這個世界中可以放置各種各樣的物體 可以理解成一個**空間**, 或者**容器** 2) 相機 如何理解相機 &#x1f914;**思考: *…

Selenium 原理【selenium】

Selenium 是什么&#xff1f;Selenium 是一個專門用于自動化操作網頁的工具集&#xff0c;它能夠模擬人類在瀏覽器中進行的各種操作&#xff0c;如點擊按鈕、填寫表單、滾動頁面等。借助 Selenium&#xff0c;開發者可以編寫腳本來控制瀏覽器&#xff0c;實現自動化測試、數據采…

【音視頻】HLS-m3u8協議介紹

參考文檔&#xff1a;https://datatracker.ietf.org/doc/html/rfc8216 一、m3u8協議概述 m3u8 協議是基于 M3U 格式擴展而來的一種多媒體播放列表協議&#xff0c;主要用于流媒體的索引和分發&#xff0c;尤其在 HLS&#xff08;HTTP Live Streaming&#xff09;技術中扮演核…

unity入門:動畫等不顯示問題——畫布設置

unity入門&#xff1a;動畫等不顯示問題——畫布設置動畫等不顯示問題大部分原因畫布Canvas總結動畫等不顯示問題大部分原因 1、畫布設置渲染模式不對&#xff0c;下文再講這個問題。 2、在層級雙擊動畫查看動畫大小&#xff0c;有些動畫創建完之后在場景大小實際很小需要在R…

【機器學習筆記 Ⅱ】3 前向傳播

前向傳播&#xff08;Forward Propagation&#xff09;實現詳解 前向傳播是神經網絡中數據從輸入層流向輸出層的過程&#xff0c;通過逐層計算每一層的輸出&#xff0c;最終得到預測結果。以下是其實現原理和步驟的完整解析&#xff1a;1. 前向傳播的核心步驟 (1) 線性變換&…

人體坐姿檢測系統開發實戰(YOLOv8+PyTorch+可視化)

本文將手把手教你構建智能坐姿檢測系統,結合目標檢測與姿態估計技術,實現不良坐姿的實時識別與預警 ### 一、項目背景與價值 現代人每天平均坐姿時間超過8小時,不良坐姿會導致: - 脊椎壓力增加300% - 頸椎病發病率提升45% - 腰椎間盤突出風險增加60% 本系統通過計算機…