list 的forEach 方法 使用lambda 和“”::”关键字

2023-11-08

 你是否会疑惑  list  遍历的时候 就这么一行是怎么做到的如此神奇?

 List<String> al = Arrays.asList("a", "b", "c", "d");
        al.forEach(System.out::println);  //神奇连元素我都没传进来怎么做到遍历的??

从源码上分析:

      点击进入方法源码:

       可以看到,此方法来自顶级接口Iterable  ,forEach  方法体中   for(T t: this) 这显然是在遍历我们每一个元素呀!所以我们现在弄清楚    for循环中   action.accept(t)   对我们list 中的每个元素干了啥,!!

首先从入参开始分析

              1 forEach 方法入参规定:Consumer<? super T> action
               2 Consumer  接口是功能接口,是被@FunctionalInterface  标注的 这个接口的模板是消费的意思,传参返回空代表消费 ,accept方法, 只要调用的方法[这里说的方法是指,System.out.println(String x),你看这个方法是不是符合 Consumer 接口待实现的方法 void accept(T t);  的模板样式,都是入参并且返回void,]符合待实现方法accept模板就可以,并且  :: 代表调用某个类的静态方法  ,意思是调用的方法被作为 Consumer 接口的实现, 这里还要知道注解@FunctionalInterface保证了接口有且仅有一个抽象方法,所以jdk能匹配到相应的 方法。
            3 还要知道  forEach 入参的类型是  Consumer   和 使用::  关键字后直接给转成对应的Consumer接口类型了(我猜测)

总结 : forEach 正常思维应该输入Consumer的接口实例,然后在写具体的待实现方法,但是我直接把待实现的方法具体传过去
        等于说我不是在传参,而是传递一种行为,传递一个函数!!而且System.out::println 就是在调用一个方法 调用System.out.println(String x),所以就是System.out.println(String x) 方法作 为参数传递给forEach,而由于Consumer  只有一个待实现的方法,所以jdk 知道这个函数一定是传给唯一的待实现方法的具体实现。

 


public class MyTest {
    public static void printValur(String str) {
        System.out.println("print value : " + str);
    }

    public static void main(String[] args) {
        List<String> al = Arrays.asList("a", "b", "c", "d");
        al.forEach(System.out::println);//==========与下面等同=================

        //==========与下面等同=================
        System.out.println("===================================");
        for (String a : al) {
            MyTest.printValur(a);
        }

      /*  解释:1 forEach 方法是list的顶级接口的Iterable 接口定义的方法,入参规定:Consumer<? super T> action
               2 Consumer  接口是功能接口,是被@FunctionalInterface  标注的 这个接口的模板是消费的意思,传参返回空代表消费 ,accept方法
              3 只要调用的方法[这里说的方法是指,printValur(String),你看这个方法是不是符合 Consumer 接口待实现的方法 void accept(T t);
                的模板样式,都是入参并且返回void
              ,]符合待实现方法accept模板就可以,并且  :: 代表调用某个类的静态方法  ,意思是调用的方法被作为 Consumer 接口的实现,
                   这里还要知道注解@FunctionalInterface保证了接口有且仅有一个抽象方法,所以jdk能匹配到相应的 方法
         4 还要知道  forEach 入参的类型是  Consumer   和 使用::  关键字后直接给转成对应的Consumer接口类型了(我猜测)
*/
        System.out.println("===================================");
        //  forEach 正常思维应该出入Consumer的接口实例,然后在写具体的待实现方法,但是我直接把待实现的方法具体传过去
        //等于说我不是在传参,而是传递一种行为,传递一个函数!!而且MyTest::printValur  就是在调用一个方法,所以就是方法作为参数传递给forEach,
        //而由于Consumer  只有一个待实现的方法,所以jdk 知道这个函数一定是传给唯一的待实现方法的具体实现。
        al.forEach(MyTest::printValur);


        //下面的方法和上面等价的=====================================


        Consumer<String> methodParam = MyTest::printValur; //方法参数


        // 1 lambda 表达式  也是对接口只有一个需要实现的方法 作用,  


        al.forEach(x -> methodParam.accept(x));//方法执行accept
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

list 的forEach 方法 使用lambda 和“”::”关键字 的相关文章

  • Roblox学习笔记

    概述 Roblox笔记 可能会顺便写一下Lua相关的 1 Roblox中变化整个物体 1 通过组合为Model整体变换 问题概要 Unity中 改变父物体的Transform子物体会一起变换 Roblox中 在 属性 面板中有两个与位置相关
  • 智慧PG集成开发平台pgting-cli发布了

    介绍 两周前我们发布了智能页面搭建平台 智慧PG pgting 深受用户青睐 很多用户尝试了在线开发组件 为了方便用户定制开发组件和组件共享 智慧PG设计之初就考虑了组件定制开发问题 为此 我们设计和研发了智慧PG集成工作台pgting c
  • 软件测试金融项目,在测试的时候一定要避开的一些雷区

    软件测试金融项目需要格外谨慎和专注 因为这些项目通常涉及大量的交易 用户隐私和其他敏感信息 以下是一些软件测试金融项目时需要关注的方面 1 数据保护 在测试金融项目时 必须确保用户数据和投资信息得到保护 测试人员必须确保测试环境和测试数据安
  • 【C++】[boost]::enable_shared_from_this类实例

    原来误以为可以用作单例 生命周期与应用本身同寿那种 后来参考例子后发现是智能指针管理下的实例 1 需要继承自enable shared from this 比如说 class Y public Boost enable shared fro
  • 安装使用MMDeploy(Python版)

    安装使用MMDeploy Python版 一 安装 MMDeploy python mmdeploy main tools deploy py mmdeploy main configs mmdet detection detection
  • 蓝牙的知识总结(1)

    1 SoC System on Chip 称为系统级芯片 一个产品 是一个有专用目标的集成电路 其中包含完整系统并有嵌入软件的全部内容 同时它又是一种技术 用以实现从确定系统功能开始 到软 硬件划分 并完成设计的整个过程 从狭义角度讲 它是
  • 【算法】字符串算法题——回文(学习篇)

    验证回文串 给定一个字符串 验证它是否是回文串 只考虑字母和数字字符 可以忽略字母的大小写 说明 本题中 我们将空字符串定义为有效的回文串 示例 1 输入 A man a plan a canal Panama 输出 true 解释 ama
  • BlocklyGame (编译方法)分析

    先列出以下几个位置 本人用的是linux BlocklyGame源码位置 https github com google blockly games 获取源码 git clone https github com google blockl
  • Web 基础 之 Eclipse 中如何把新建的 jsp 文件默认的编码格式(ISO-8859-1)修改为 UTF-8,避免中文乱码

    Web 基础 之 Eclipse 中如何把新建的 jsp 文件默认的编码格式 ISO 8859 1 修改为 UTF 8 避免中文乱码 目录 Web 基础 之 Eclipse 中如何把新建的 jsp 文件默认的编码格式 ISO 8859 1
  • 网络安全中机器学习大合集

    目录 数据集 论文 书籍 演讲 教程 课程 杂项 数据集 安全相关数据样本集 DARPA 入侵检测数据集 Stratosphere IPS 数据集 开放数据集 NSA 的数据捕获 ADFA 入侵检测数据集 NSL KDD 数据集 恶意 UR
  • arm ldr/ld/数据加载系列指令和adr指令

    ldrb指令 1 语法 armv7手册语法 LDRB
  • Android中收听特定应用安装成功的广播

    一 manifest的配置
  • C语言当中的分段函数求解

    对于学习C语言的小白来说 经常会遇到求解分段函数的问题 下面是小编写的一段求解分段函数的代码 希望对于初学的你们有所帮助 代码求解的分段函数为 y f x 4x 3 x lt 15 y f x 2 5x 10 5 x gt 15 inclu
  • 网络编程--TCP/IP协议(一)

    目录 前言 一丶网络基础 lt 1 gt 认识IP地址 1 gt 具体格式 2 gt 组成 3 gt 分类 4 gt 子网掩码 lt 2 gt 认识MAC地址 二丶网络设备及相关技术 lt 1 gt 物理层 集线器 lt 2 gt 数据链路
  • C++:实现计算贷款支付额问题

    计算月支付额的公式如下 月支付额 贷款总额 月利率 1 1 1 月利率 年数 12 include
  • win10使用腾讯会议软件没声音怎么解决

    购买了一个USB接口的带微麦网络摄像头 在win10电脑上打开腾讯会议软件进入会议后讲话始终没有声音输出 经尝试 排除麦克风和声卡音箱硬件和驱动的原因之后 Win10操作系统上腾讯会议麦克风能接收到输入但没有声音播出 一般会是麦克风设置和w
  • 什么是数据产品,如何设计一款好用的数据产品

    何为数据产品 从广义上讲 一切以数据作为驱动或者核心的都叫数据产品 例如数据报表平台 DMP 搜索与精准化产品 风控产品等等 从狭义上讲 就是公司的内部数据平台 今天和大家讨论的 主要是关于公司的内部数据平台的搭建 公司的内部数据平台 主要
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】计算最大乘积

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 计算最大乘积 知识点字符串位运算 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 给定一个元素类型为小写字符串的数组 请计算两个没有相同字符的元素 长度乘积的最大值 如果
  • GAN网络系列博客(一):用于人脸生成的StyleGAN结构

    目录 简介 基于风格的生成器 生成器的性质 总结 Reference 在未来的一段时间 我会开一个小专题 来介绍下GAN网络的一些经典论文 希望对那些想要入坑的同学提供一点点帮助 考虑到StyleGAN系列论文在相关领域的影响力 我们首先来
  • QT 多线程实现方式

    前因 当调用QApplication exec 时 就启动了QT的事件循环 在开始的时候QT会发出一些事件命令来显示和绘制窗口部件 在这之后 事件循环就开始运行 它不断检查是否有事件发生并且把这些事件发生给应用程序的QObject 当处理一

随机推荐

  • 微信小程序使用van-tabs组件,ios真机z-index层级错乱问题【已解决,ios自定义组件层级不穿透】

    一 这是模拟器上的效果 二 这是苹果11真机上的效果 安卓真机正常 三 先来理一下代码的层级现状 A 为van tabs B 是自定义组件 为数据列表 C为单个数据 D 也是自定义组件 图中省略 为单个数据详情弹窗 且D是B的子组件 在z
  • 题目0158-快递业务站

    快递业务站 题目描述 快递业务范围有 N 个站点 A 站点与 B 站点可以中转快递 则认为 A B 站可达 如果 A B 可达 B C 可达 则 A C 可达 现在给 N 个站点编号 0 1 n 1 用 s i j 表示 i j 是否可达
  • 信任的机制——区块链

    区块链是一个从顶向下实现的一项技术 是可以设计 可以编程的 区块链是一个信任的机器 是在完全不信任的节点之间建立信任机制的技术 是利用互联网传递价值的一种价值网络 这是一个把时间当朋友的技术 区块链在应用的过程中通过自身的设计 解决的问题
  • SAX解析xml

    第一步 创建xml
  • 【死磕 Java 基础】 — 你以为异常就是 try…catch ?那你天真了

    大家好 我是大明哥 个人网站 https www cmsblogs com 前言 我敢说对于很多小伙伴来说 他们以为在 Java 中异常就是 try catch 稍微有点儿意识的还会用下 throw new Exception 真的有这么简
  • osg的ref_ptr和observer_ptr

    ref ptr就是所谓的强指针类型 observer ptr是所谓的弱指针类型 需要注意的是他们都是类 而不是指针 只不过他们用于管理指针 1 如何实现自动内存管理 所谓自动内存管理就是只管对象或指针的创建和使用而不管销毁 实现自动内存管理
  • 关于ORACLE清理表空间总结

    1 查看索引和表的初始大小 SELECT bytes 1024 1024 M TABLE SIZE u FROM dba SEGMENTS U WHERE U owner IN CLEAR TRADE INTERFACE SECURITY
  • 【THOI 2012】 水位

    A1363 水位 思路题 做这道题的时候如果思路清晰的话 就是一道简单的乘法原理 高精度题 按照原始高度升序排序 最开始 所有点各自属于一个连通块 按照高度顺序 从最低的开始合并连通块 假设当前处理到 l r l r这个区间 他们的高度都是
  • Unity实现用WASD控制一个物体前后左右移动-小白课程01

    1 根据业务逻辑搭建场景 02 根据业务写代码 using System Collections using System Collections Generic using UnityEngine 实现让被挂在的物体往前移动 按下W键往前
  • git submodule的使用

    开发过程中 经常会有一些通用的部分希望抽取出来做成一个公共库来提供给别的工程来使用 而公共代码库的版本管理是个麻烦的事情 今天无意中发现了git的git submodule命令 之前的问题迎刃而解了 添加 为当前工程添加submodule
  • FasterRCNN详解

    FasterRCNN详解 1 2 2 FasterRCNN 1 模型 1 1 主干网络VGG16 or ResNet50 1 2 RPN生成建议框 1 3 RCNN进行分类和回归 2 预测 2 1 预测流程 3 训练 3 1 训练流程 3
  • 多目标跟踪:SORT和Deep SORT

    https zhuanlan zhihu com p 59148865 多目标跟踪 即Multiple Object Tracking MOT 主要任务中是给定一个图像序列 找到图像序列中运动的物体 并将不同帧的运动物体进行识别 也就是给定
  • let和const与var的区别

    目录 一 定义 二 let 三 const 四 代码演示 四 循环中let和var声明的循环变量的区别 4 1 事件的绑定 4 2 循环变量存储的数据数值 4 2 1 var声明的循环变量 4 2 2 let声明的循环变量 一 定义 let
  • 快速排序C++(极简)

    原理建议去B站看视频 注意 注意 注意 刚开始移动的顺序真的很重要 可以试试顺序换一下 整个代码就出问题了 我试过的 第11和12行 代码如下 从小到大 为例 include
  • 操作系统-内存管理

    内存的基础知识 内存可存放数据 程序执行前需要先放到内存中才能被CPU处理 缓和CPU与硬盘之间的速度矛盾 如何区分各个程序的数据是放在什么地方 给内存的存储单元编地址 内存地址从0开始 每个地址对应一个存储单元 装入的三种方式 绝对装入
  • 海康威视测试实习生面试经历

    时间 2018 4 25 地点 海康威视二期 面试岗位 测试实习生 面试结果 通过 背景 大三 通信工程 自学了JAVA 还没学到框架 还是前一天看了一点测试的基础知识就去面试了 面试时间好久 技术面半小时 HR面半小时 技术面 面试官一男
  • 2PC(两阶段提交)方案

    XA方案 2PC的传统方案是在数据库层面实现的 如Oracle MySQL都支持2PC协议 为了统一标准减少行业内不必要的对接成本 需要制定标准化的处理模型及接口标准 国际开放标准组织Open Group定义了分布式事务处理模型DTP Di
  • 微信小程序(初学篇)——仿美团外卖

    初识小程序 为它的小巧玲珑所吸引 不由得心血来潮 这不正是用户所需要的吗 既方便快捷 又不占手机内存 所以我下定决心一定要做出一个自己的小程序 然后赚钱 赚钱 赚钱 当然现在只是学习阶段 所以先仿一个高端产品来挑战自我吧 说到高端 自然然而
  • android定位webview元素,appium— Android定位webView里面的UI元素

    Android SDK中的UIAutomator中本身是不支持网页中的UI元素定位 下面介绍几种常用的定位app内部的网页的UI元素的方法 一 使用chrome浏览器调试移动端网页 这是使用最多的一种方法 首页确保自己的手机已经跟电脑连接且
  • list 的forEach 方法 使用lambda 和“”::”关键字

    你是否会疑惑 list 遍历的时候 就这么一行是怎么做到的如此神奇 List