教你看懂System.out::println

教你看懂System.out::println在不经意间,我们会看到这样的代码//创建出一个数组List<String>strList=Arrays.asList("YangHang","AnXiaoHei","LiuPengFei");strList.forEach(System.out::println);第一印象,哇,好高大上的写法,那么这究竟是…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在不经意间, 我们会看到这样的代码

        // 创建出一个数组
        List<String> strList = Arrays.asList("YangHang", "AnXiaoHei", "LiuPengFei");

        strList.forEach(System.out::println);

第一印象, 哇, 好高大上的写法, 那么这究竟是怎样的一种语法呢。
我们一步一步来探究:
首先, 我们看一下是java.lang.Iterable<T>下的一个默认方法forEach调用的, 好家伙, 一看到这个function包下面的被@FunctionalInterface注解声明的Consumer<T>接口, 瞬间就了然了, 这不又是函数式编程搞的鬼么?(如果大家不理解什么是函数式编程, 可以去看看我的一篇博客 —— 深入浅出讲解Optional包装类, 里面有详细的介绍和代码 )。
现在的问题应该很明朗了, System.out::println这段代码其实就是Consumer<T>接口的一个实现方式啊。 具体是怎么实现的, 我们再码一段代码。

    @Test
    public void testDemo2() {
        List<String> strList = Arrays.asList("YangHang", "AnXiaoHei", "LiuPengFei");

        strList.forEach(x -> {
            System.out.println(x);
        });
    }

然后, 我们惊喜的发现和上面的代码运行结果是一制的, 我们基本上可以断定, 上面那种写法是下面这种的一种缩写形式。 就是把你遍历出来的每一个对象都用来去调用System.out(也就是PrintStream类的一个实例)的println方法。
最后, 大家是不是有一个想法, 想自己写一个Consumer<T>接口的实现类, 让foreach调用一下。

/**
 * 打印加强处理类
 * <p>
 * 
 * @author YangHang
 * @Date 2018年12月9日 下午12:25:30
 *
 */
public class PrintUtil {

    /**
     * 对要遍历的元素添加add操作
     */
    public void addString(String x) {
        System.out.println(x + "add");
    }
}

然后, 我们这么来玩

    @Test
    public void testDemo3() {
        List<String> strList = Arrays.asList("YangHang", "AnXiaoHei", "LiuPengFei");

        strList.forEach(new PrintUtil()::addString);
    }

运行一下, 果然可以。
但是我发现, 如果是静态方法的时候必须得用类名双冒号静态方法, 这估计是语法的一种, 发夹注意就好。


我的个人公众号,关注之后可以向我留言,比如关于我进阿里的面试知识,有简历、学习路线的问题也欢迎询问我
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/186559.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 完美可用-DirectX修复工具增强版DirectX Repair

    完美可用-DirectX修复工具增强版DirectX RepairDirectX修复工具最新版:DirectXRepairV3.7增强版  NEW!版本号:V3.7.0.26539大小:107MB/7z格式压缩,189MB/zip格式压缩,322MB/解压后其他版本:标准版   在线修复版MD5校验码:DirectXRepair.exe/0615325098da4e624ef854af60b56ba2       DirectX_…

  • centos7 安装图形界面

    centos7 安装图形界面本人用VMware版本15.0.2build-10952284(关系不大)开启前要在虚拟机–>设置–>3D图形如下如果是云服务器跳过此步yum下载图形界面软件yumgroupinstall”GNOMEDesktop””GraphicalAdministrationTools”修改配置ln-sf/lib/systemd/system…

  • vue(24)网络请求模块axios使用「建议收藏」

    vue(24)网络请求模块axios使用「建议收藏」什么是axiosAxios是一个基于promise的HTTP库,可以用在浏览器和node.js中。主要的作用:axios主要是用于向后台发起请求的,还有在请求中做更多是可控功能。a

  • Ifconfig_5k是多少啊

    Ifconfig_5k是多少啊文章目录Linux_day06-07Linux的网络相关一.设置主机名二.chkconfig服务配置三.ntp服务四.防火墙服务——软件防火墙五.网络相关的一些命令1. **ifconfig**2. **netstat**3. **ping**4. **telnet**——用于测试端口连通性5. **curl**——资源定位Linux_day06-07Linux的网络相关一.设置主机名临时设置:#hostname 新主机名(切换用户生效,重启还原)永久设置:修改配置文件/etc/hostname

  • vue生成二维码并保存图片_php二维码生成代码

    vue生成二维码并保存图片_php二维码生成代码图片地址生成二维码

  • pycharm注释快捷键无法注释html文本解决方法

    pycharm注释快捷键无法注释html文本解决方法解决pycharm注释快捷键无法注释html文本方法如图修改成值None以后,command+/快捷键,html注释的符号就是<!/–注释内容–>;为Jinja2的时候,注释符号就是{#注释内容#}。修改成None时,Html就没有办法使用Jinja2的快捷输入了…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号