标签:上下 package substr 16px code name out size hello
体验方法引用
在使用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()); } }
标签:上下 package substr 16px code name out size hello
原文地址:https://www.cnblogs.com/lsswudi/p/11445839.html