zoukankan      html  css  js  c++  java
  • 方法引用

    体验方法引用
    在使用L ambda表达式的时候,我们实际上传递进去的代码就是一种解决方案: 参数做操作
    那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复 逻辑呢?
    答案肯定是没有必要
    那我们又是如何使用已经存在的方案的呢?
    这就是我们要讲解的方法引用,我们是通过方法用来使用已经存在的方案

    */
    public class PrintableDemo {
    public static void main(String[] args) {
    //在主方法中调用usePrintable方法
    //
    usePrintable((String s) -> {
    i/
    System. out. println(s);
    //
    });
    usePrintable(s -> System. out . println(s));
    //
    System . out. println(”爱生活爱Java");
    //方法引用符: ::
    usePrintable(System. out: :println);|
    //可推导的就是可省略的
    }
    private static void usePrintable(Printable p) {
    p.printString( s: “爱生活爱Java");


    方法引用符
    ●:: 该符号为引用运算符,而它所在的表达式被称为方法弓用
      回顾一- 下我们在体验方法引用中的代码
    ●Lambda表达式: usePrintable(s -> System.out.println());
      分析:拿到参数s之后通过Lambda表达式,传递给System.out.printIn方法去处理
    ●方法 用: usePrintable(System.out:println);
      分析:直接使用System.out中的printIn方法来取代Lambda,代码更的简洁
    推导与省略
      ●如果使用Lambda,那么根据” 可推导就是可省略”的原则,无需指定参数类型,也无需指定的重载形式,它们都将被自动推导
      ●如果使用方法引用, 也是同样可以根据上下文进行推导
      ●方法引用是Lambda的孪生兄弟

    package com.inTest02;
    /*
        需求:
                1:定义一个接口(Printable):里面定义一个抽象方法: void printInt(int i);
                2:定义一个测试类(PrintableDemo),在测试类中提供两个方法
                一个方法是: usePrintable(Printable p)
                -个方法是主方法,在主方法中调用usePrintable方法
    
     */
    
    public class PrintableDemo {
        public static void main(String[] args) {
    //        在主方法中调用usePrintable方法
            usePrintable(i -> System.out.println(i));
            //方法引用
            usePrintable(System.out::println);
    
        }
    
        private static void usePrintable(Printable p) {
            p.printInt(666);
    
        }
    }
    
    
    ----------------------------------------------------------
    package com.inTest02;
    
    public interface Printable {
        void printInt(int i);
    }

     Lambda表达式支持的方法引用
    1.引用类方法
    引用类方法,其实就是引用类的静态方法
    ●格式: 类名::静态方法
    ●范例: Integer::parselnt
    Integer类的方法: public static int parselnt(String s)将此String转换为int类型数据


    package com.inTest02;
    /*
    练习:
            ●定义一个接口(Converter), 里面定义一个抽象方法
            int convert(String s);
            ●定义一个测试类(ConverterDemo), 在测试类中提供两个方法
            -个方法是: useConverter(Converter c)
            -一个方法是主方法,在主方法中调用useC onverter方法
    
     */
    
    public class ConverterDemo {
        public static void main(String[] args) {
    //任王万法中调用useConverter万法
    //        useConverter((String s) -> {
    //            return Integer. parseInt(s);
    //        });
    //        useConverter(s -> Integer . parseInt(s));
    // 引用类方法
            useConverter(Integer::parseInt);
    
        }
    
        private static void useConverter(Converter c) {
            int number = c.convert("666");
            System.out.println(number);
    
        }
    }

    1.5引用对象的实例方法
    引用对象的实例方法,其实就引用类中的成员方法
    格式:对象:成员方法
    ●范例: , "HelloWorld::toUpperCase
      String类中的方法: public String toUpperCase0将此String所有字符转换为大写

    public class PrinterDemo {
        public static void main(String[] args) {
    //在主方法中调用usePrinter方法
    /.
            usePrinter((String s) -> {
    //// |
                String result = s.toUpperCase();
    ////
                System.out.println(result);
    //
                System.out.println(s.toUpperCase());
    //
            });
            usePrinter(s -> System.out.println(s.toUpperCase()));
    //引用对象的实例方法
            PrintString ps = new PrintString();
            usePrinter(ps: :printUpper);
    //Lambda表达式被对象的实例方法替代的时候,它的形式参数全部传递给该方作为参
        }
    
        private static void usePrinter(Printer p) {
            p.printUpperCase(s:"HelloWorld");
        }

    1.6引用类的实例方法
    引用类的实例方法,实就是用类中的成员方法
    格式:类名::成员方法
    ●范例: String:substring
      String类中的方法: public String substring(int beginlIndex,int endIndex)
      从beginIndex开始到endIndex结束,截取字符串。返回一个子串,子串的长度为endIndex beginIndex

    public class MyStringDemo {
    public static void main(String[] args) {
    //在主方法中调用useMyString方法
    //
    useMyString((String s,int x,int y) -> {
    //
    return s. substring(x,y);
    //
    });
    useMyString((s,x,y) -> s.substring(x,y));
    //引用类的实例方法
    useMyString(String: :substring);
    //Lambda表达式被类的实例方法替代的时候
    //第一个参数作为调用者
    //后面的参数全部传递给该方法作为参数
    }
    private static void useMyString(MyString my) {
    String s = my. mySubString( s: "HelloWorld", x: 2,y: 5);
    System. out . print1n(s);
    }

    1.7引用构造器
    引用构造器,其实就是引用构造方法
    ●格式:类名::new
    ●范例: Student::new

    public class StudentDemo {
    public static void main(String[] args) {
    //在主方法中调用useStudentBuilder方法
    //
    useStudentBuilder((String name, int age) -> {
    ////
    Student s = new Student(name, age);
    ///
    return 5;
    /
    return new Student(name, age);
    //
    });
    useStudentBuilder((name,age) -> new Student(name,age));
    //引用构造器
    useStudentBui lder( Student: :new);
    //Lambda表达武被构造器替代的时候,它的形式参数全部传递给构造器作为参数
    }
    private static void useStudentBuilder(StudentBuilder sb) {
    Student s = sb. build( name: "林青霞”,
    age: 30);
    System. out. println(s. getName() + ",”+ s.getAge());
    }
    }



  • 相关阅读:
    梦断代码阅读笔记之二
    《需求工程——软件建模与分析》阅读笔记之四
    阿里云HttpDns接入
    Android电量优化-Battery Historian环境搭建及简单使用
    Crash监控的简单实现方案
    Flutter——比RichText更好用的富文本
    用终端命令行工具iTerm创建flutter项目
    Flutter——打包到TestFlight和安卓
    Flutter——数组以符号隔开转字符串
    某信反反越狱
  • 原文地址:https://www.cnblogs.com/lsswudi/p/11445839.html
Copyright © 2011-2022 走看看