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 或其父类(如 ObjectCharSequence)的 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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% 本系统通过计算机…