教你看懂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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PHP如何添加内置的扩展

    PHP如何添加内置的扩展

    2022年1月3日
    53
  • 代理重加密算法_凯撒密码采用三重加密技术

    代理重加密算法_凯撒密码采用三重加密技术1、研究背景作用:密文云数据动态共享基于用户数据隐私性考虑,用户存放在云端的数据都是加密形式存在的。而云环境中存在着大量数据共享的场景。由于数据拥有者对云服务提供商并不完全信任,不能将解密密文的密钥发送给云端,由云端来解密并分享出去。数据拥有者自己下载密文解密后,再用数据接收方的公钥加密并分享,无疑给数据拥有者带来很大的麻烦,同时也失去了云端数据共享的意义。代理重加密可以在不泄漏数据拥…

    2022年9月9日
    0
  • GWT 优点和缺点「建议收藏」

    GWT 优点和缺点「建议收藏」GWT 优点和缺点

    2022年4月23日
    43
  • Android四大组件Broadcast中注册广播registerReceiver流程源代码详解

    Android四大组件Broadcast中注册广播registerReceiver流程源代码详解在Android系统中,为什么需要广播机制呢?广播机制,本质上它就是一种组件间的通信方式,如果是两个组件位于不同的进程当中,那么可以用Binder机制来实现,如果两个组件是在同一个进程中,那么它们之间可以用来通信的方式就更多了,这样看来,广播机制似乎是多余的。然而,广播机制却是不可替代的,它和Binder机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。在软件工程中,是非常强

    2022年9月11日
    0
  • 二极管工作状态的判断_有两个二极管的工作状态怎么判断

    二极管工作状态的判断_有两个二极管的工作状态怎么判断看了很多说法,感觉都没有对三极管饱和时内部载流子的流向分析说清楚…….看来最基本的问题,深究起来才是最难的。在网上苦苦寻觅,找到eet论坛中的一个问答回复,算是勉强可以回答我这个疑问吧,如下:http://forum.eet-cn.com/FORUM_POST_10012_1200158575_0.HTM?jumpto=view_welcomead_forum_1324483377358…

    2022年9月10日
    0
  • python 股票历史数据(python获取股票历史数据)

    因为最近需要用到股市的各种指数数据,刚开始想的是从同花顺等交易软件直接导出,结果发现要用滚轮滚到最开始的日期,这过于繁琐了,我对于这种重复性的劳动一向不耐烦,而且这种方法在以后每日更新的时候也很不方便。所以我把视线转向了网上的各种api。网上比较普遍的主要有两种,一种是新浪的api,一种是雅虎的api。新浪的api很方便,速度也很快,不过就网上的资料而言,似乎只能提取当天的数据。雅虎的api功能更齐

    2022年4月17日
    253

发表回复

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

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