方法引用
Posted lsswudi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了方法引用相关的知识,希望对你有一定的参考价值。
体验方法引用
在使用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());
以上是关于方法引用的主要内容,如果未能解决你的问题,请参考以下文章