JDK1.8之Lambda方法引用

lambda表达式和方法引用是孪生兄弟,方法引用的使用在很多情况下简化了lambda表达式。

方法引用符  ::

由lambda表达式简化得到方法引用,体验方法引用:

package com.demo.method;

public class PrintableDemo {
        public static void main(String[] args) {
            //lambda表达式
            print(s->System.out.println(s));
            //方法引用
            print(System.out::println);
        }
        static void print(Printable p) {
            p.printString("hello word!");
        }
    }

    interface Printable {
        void printString(String s);
    }
输出结果:
hello word!
hello word!

引用类方法:

package com.demo.method;
/**
 * 引用类方法,例将字符串通过Integer.parseInt()转化为大写字符串
 */
public class ConverterDemo {
    public static void main(String[] args) {
        useConverter(Integer::parseInt);
    }
    static void useConverter(Converter con) {
        int a=con.convert("34");
        System.out.println(a);
    }
}

interface Converter {
    int convert(String a);
}
输出结果:
34

引用对象的实例方法:

package com.demo.method;
/*
 * 引用对象的实例方法
 */
public class PrinterDemo {
    public static void main(String[] args) {
        //使用lambda表达式
        usePrinter(s->System.out.println(s.toUpperCase()));
        //使用对象的实例方法
        PrintString pr=new PrintString();
        usePrinter(pr::printUpper);

        //如果方法是静态的就直接类::方法名
        usePrinter(PrintString::printUpper1);
    }
    static void usePrinter(Printer pr){
        pr.printUpperCase("hello word!");
    }
}

interface Printer {
    void printUpperCase(String a);
}

class PrintString {
    public void printUpper(String str) {
        System.out.println(str.toUpperCase());
    }
    static void printUpper1(String str) {
        System.out.println(str.toUpperCase());
    }
}
输出结果:
HELLO WORD!
HELLO WORD!
HELLO WORD!

引用类的实例方法:

package com.demo.method;

/*
 * 引用类的实例方法
 */
public class MyStringDemo {
    public static void main(String[] args) {
        //使用lambda表达式
        useMyString((str,a,b)->str.substring(a, b));
        //使用类中的实例方法
        useMyString(String::substring);
        //lambda表达式被类的实例方法替代的时候,第一个参数最为调用者,后面的参数作为方法参数,如上例
    }
    static void useMyString(MyString mys) {
        String str=mys.mySubString("hello", 2 ,4);
        System.out.println(str);
    }
}
interface MyString{
    String mySubString(String str,int a,int b);
}
输出结果:
11
11

引用构造器:

package com.demo.method;

/*
 * 引用构造器
 */
public class StudentDemo {
    public static void main(String[] args) {
        //lambda表达式
        useStudentBuilder((s,a)->new Student(s, a));
        //引用构造器
        useStudentBuilder(Student::new);
        //将参数全部传到构造器中
    }
    private static void useStudentBuilder(StudentBuilder stu) {
        Student s= stu.build("小飞", 20);
        System.out.println(s.getName()+"  "+s.getAge());
    }
}

class Student{
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    String name;
    int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}
interface StudentBuilder{
    Student build(String name,int age);
}
输出结果:
小飞  20
小飞  20

注:参考文献:

https://www.cnblogs.com/fangtingfei/p/11275737.html

猜你喜欢

转载自blog.csdn.net/qq_30764991/article/details/113100999