方法引用

体验方法引用
在使用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());
}
}

 



 

posted @ 2019-09-02 12:31  水果、、  阅读(368)  评论(0编辑  收藏  举报