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


相关推荐

  • HTML多行代码搞定微信8.0的炸裂特效!C/C++怎么能输「建议收藏」

    HTML多行代码搞定微信8.0的炸裂特效!C/C++怎么能输「建议收藏」HTML多行代码搞定微信8.0的炸裂特效!C/C++怎么能输是Cpp呀2021-01-2816:00微信8.0更新的一大特色就是支持动画表情,如果发送的消息只有一个内置的表情图标,这个表情会有一段简单的动画,一些特殊的表情还有全屏特效,例如烟花表情有全屏放烟花的特效,炸弹表情有爆炸动画并且消息和头像也会随之震动。近日,前端工程师华峰用300行代码实现微信表情包炸裂的特效,一起来看看做出来的效果吧:据他描述:项目的核心是使用到了lottie动画库。lottie是.

    2025年6月16日
    0
  • gamma分布的分布函数_gamma分布和beta分布

    gamma分布的分布函数_gamma分布和beta分布1.Gamma函数首先我们可以看一下Gamma函数的定义:Γ(x)=∫∞0tx−1e−tdtΓ(x)=∫0∞tx−1e−tdt\Gamma(x)=\int_{0}^{\infty}t^{x-1}e^{-t}dtGamma的重要性质包括下面几条:1.递推公式:Γ(x+1)=xΓ(x)Γ(x+1)=xΓ(x)\Gamma(x+1)=x\Gamma(x)2.对于正整数n,有…

    2022年10月12日
    0
  • android之来电自动拒接并自动回复短信_上课模式app「建议收藏」

    上课的时候老师说总是错过电话,对方打来没人接还一遍遍的打,觉得可以有个app在上课期间自动拒接电话,并自动回复短信过去.当然了,需要权限的.尝试做了个雏形出来.界面如下:主要代码如下:package jason.teacher;import java.lang.reflect.Method;import java.util.HashMap;import ja

    2022年3月10日
    146
  • SSM-Spring整合Mybatis[通俗易懂]

    SSM-Spring整合Mybatis[通俗易懂]步驟导入相关jar包junitmybatismysql数据库spring相关的aop植入mybatis-spring[new]<!–导入依赖–> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifa

    2022年8月8日
    3
  • jenkins自定义构建参数_jenkins自动部署

    jenkins自定义构建参数_jenkins自动部署前言当我们的自动化项目越来越多的时候,在代码仓库会提交不同的分支来管理,在用jenkins来构建的时候,我们希望能通过参数化构建git仓库的分支。下载安装GitParameter插件系统管理-

    2022年7月28日
    16
  • TDA2030的功率放大电路详细教程「建议收藏」

    TDA2030的功率放大电路详细教程「建议收藏」本电路可以将是利用运放TDA2030A制作的功率放大器。电源电压为±12V至±22V。输出的最大功率为18W。该电路为深度负反馈电路,输出电压的放大倍数约为Av=R1/R2=32.3(具体放大倍数请参考模电书籍负反馈部分)。其中R4选用大功率水泥电阻,因为空载时流过R4的电流会过大。D1与D2为二极管,有黑线或者银色线的一端为负极。没有标有正负号的电容为无极电容,不需要区别正负极。标有正负…

    2022年5月30日
    48

发表回复

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

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