教你看懂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);
    }

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


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

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【ArcGIS二次开发】鹰眼的实现「建议收藏」

    【ArcGIS二次开发】鹰眼的实现「建议收藏」1、添加程序集usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.DataSourcesFile;usingESRI.ArcGIS.Geodatabase;usingESRI.ArcGIS.DataSourcesRaster;usingESRI.ArcGIS.Geometry;usingESRI.ArcGIS.Display;usingESRI.ArcGIS.esriSystem;*出现“命名

    2022年7月23日
  • FatMouse&#39; Trade(杭电1009)

    FatMouse&#39; Trade(杭电1009)

    2022年1月23日
  • idea 设置导入包不带*

    idea 设置导入包不带*

    2021年5月16日
  • 如何写 Cover Letter 论文投稿「建议收藏」

    如何写 Cover Letter 论文投稿「建议收藏」论文投稿时一般要求附带一篇“CoverLetter”,好的“CoverLetter”不仅可以使文章锦上添花,更有可能直接决定论文是否被录用。本人切身体会,以已发表论文为例,现将其写法经验归纳如下:Dear Editor,We would like to submit the enclosed manuscript entitled "论文题目", which we wish to be con…

    2022年6月4日
  • JAVA中ResourceBundle使用详解

    JAVA中ResourceBundle使用详解JAVA中ResourceBundle使用详解这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念,两者都是一起出现的。可以说,国际化的目的就是为了实现本地化。比如对于“取消”,中文中

    2022年7月4日
  • android平台db4o使用示例

    android平台db4o使用示例db4o是一个纯对象的数据库,现支持java和.NET。07年的时候,db4objects宣布db4o已可以顺利运行于Android平台,当时db4objects公司和db4o的爱好者积极推进db4o运行于GoogleAndroid平台,以期待让db4o成为Android上的首选数据库平台,但令人遗憾的是google最后选择了sqlite作为作为android平台的数据库。但是没有关系,db4o

    2022年7月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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