zoukankan      html  css  js  c++  java
  • 方法引用表达式(1)

    概述

    在使用lambda表达式的时候,我们实际上传递进去的代码就是一种解决办法:拿什么参数做什么操作,那么考虑一种情况:如果我们在lambda中所指定的操作方案,已经有地方存在相同的方案,那么是否还有必要再重写重复逻辑。

    代码演示

    package day17;
    
    public class Demo01Print {
        //定义一个方法,参数传递Printable接口,对字符串进行打印
        public static void printString(Printable p){
            p.print("helloword");
        }
    
        public static void main(String[] args) {
            //调用printString方法,方法的参数Printable是一个函数式接口,所以可以传递lambda
            printString((s)->{
                System.out.println(s);
            });
    
            printString(System.out::print);
        }
    
        /*
        分析:
        lambda表达式的目的,打印参数传递的字符串
        把参数s,传递给了system.out对象,调用out对象中的方法println对字符串进行了输出
        注意:
            1.system.out对象是已经存在的
            2.println方法也是已经存在的
        所以可以使用方法引用来优化lambda表达式
        可以使用system.out方法直接引用(调用)println方法
         */
    }
    

    方法引用符

    双冒号::为引用运算符,而它所在的表达式被称为方法引用。如果lambda要表达的函数方法已经存在于某个方法的视线中,那么则可以通过双冒号来引用该方法作为lambda的替代者。

    语义分析

    例如概述里面举的例子,system.out对象中有一个重载的println(String)方法恰好就是我们所需要的。那么对于printString方法的函数式接口参数,对比下面两种写法,完全等效:

    lambda表达式写法:s -> System.ouot.println(s);

    方法引用写法:System.out::println

    第一种语义是指:拿到参数之后经lambda之手,继而传递给system.out.println方法去处理。

    第二钟等效写法的语义是指:直接让system.out中的println方法来取代lambda。两种写法的执行效果完全一样,而第二钟方法引用的写法服用了已有方案,更加简洁。

    注:lambda中,传递的参数一定是方法引用中的那个方法可以接受的类型,否则会抛出异常、

    推导与省略

    如果使用lambda,那么根据“可推导就是可省略”的原则,无需指定参数类型,也无需指定的重载形式--它们都将被自动推导。而如果使用方法引用,也是同样可以根据上下文进行推导。

    函数式接口是lambda的基础,而方法引用是lambda的孪生兄弟。

  • 相关阅读:
    HTML中所用的标签(二)
    HTML中所用的标签(一)
    学习笔记之04表格嵌套练习1
    学习笔记之03百度搜索页面
    学习笔记之02简单的基础
    学习笔记之01程序员起航篇
    Part 53 to 55 Talking about Reflection in C#
    Part 48 to 51 Talking about Access Modifiers in C#
    Part 59 to 60 Difference between Convert ToString and ToString,String and StringBuilder
    Part 57 to 58 Why should you override ToString and Equal Method
  • 原文地址:https://www.cnblogs.com/Xiaoming0/p/14022024.html
Copyright © 2011-2022 走看看