当前位置:   article > 正文

java基础之方法引用_useconverter

useconverter

目录

1. 体验方法引用

2. 方法引用符

3. Lambda表达式支持的方法引用

4. 引用类方法

5. 引用对象的实例方法

6. 引用类的实例方法

7.引用构造器


1. 体验方法引用

在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿参数做操作

那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢?

那我们有事如何使用已经存在的方案呢?

这就是我们要讲解的方法引用,我们是通过方法引用来使用已经存在的方案

实例:

  1. public class PrintableTest {
  2. public static void main(String[] args) {
  3. usePrintable(s -> System.out.println(s));
  4. //方法引用符
  5. usePrintable(System.out::println);
  6. //可推导的就是可省略的
  7. }
  8. private static void usePrintable(Printable p) {
  9. p.printString("好好学习,天天向上!");
  10. }
  11. }

2. 方法引用符

方法引用符

  • ::该符号为引用运算符,而它所在的表达式被称为方法引用

回顾一下我们在体验方法引用中的代码

  • Lambda表达式:usePrintable(s -> System.out.println(s));

                分析:拿到参数s之后通过Lambda表达式,传递给System.out.println方法去处理

  • 方法引用:usePrintable(System.out::println);

                分析:直接使用System.out中的println方法来取代Lambda,代码更加的简洁

推导与省略

  • 如果使用Lambda,那么根据“可推导就是可省略”的原则,无需指定参数类型,也无需指定的重载形式,它们都将被自动推导
  • 如果是方法引用,也是同样可以根据上下文进行推导
  • 方法引用是Lambda的孪生兄弟

实例:

  1. public class PrintableTest {
  2. public static void main(String[] args) {
  3. usePrintable(i -> System.out.println(i));
  4. //方法引用
  5. usePrintable(System.out::println);
  6. }
  7. private static void usePrintable(Printable p) {
  8. p.printInt(666);
  9. }
  10. }

3. Lambda表达式支持的方法引用

常见的引用方式:

  • 引用类方法
  • 引用对象的实例方法
  • 引用类的实例方法
  • 引用构造器

4. 引用类方法

引用类方法,其实就是引用类的静态方法

  • 格式:类名::静态方法
  • 范例:Integer::parseInt

                Integer类的方法:public static int parseInt(String s)将此String转换为int类型数据

练习:

  • 定义一个接口(Converter),里面定义一个抽象方法

                  int concert(String s);

  • 定义一个测试类(ConverterTest),在测试类中提供两个方法

                一个方法是:useConverter(Converter c)

                一个方法是主方法,在主方法中调用useConverter()方法

实例:

  1. public class ConverterTest {
  2. public static void main(String[] args) {
  3. useConverter(s -> Integer.parseInt(s));
  4. //引用类方法
  5. useConverter(Integer::parseInt);
  6. }
  7. private static void useConverter(Converter c) {
  8. int number = c.convert("666");
  9. System.out.println(number);
  10. }
  11. }

5. 引用对象的实例方法

引用对象的实例方法,其实就是引用类中的成员变量

  • 格式:对象::成员方法
  • 范例:"HelloWorld"::toUpperCase

                String类中的方法:public String toUpperCase()将此String所有字符转换为大写

练习:

  • 定义一个类(PrintString),里面定义一个方法

                public void printUpper(String s):把字符串参数变成大写的数据,然后在控制台输出

  • 定义一个接口(Printer),里面定义一个抽象方法

                void printUpperCase(String s)

  • 定义一个测试类(PrinterTest),在测试类中提供两个方法

                一个方法是:usePrinter(Printer p)

                一个方法是主方法,在主方法中调用usePrinter方法

实例:

  1. public class PrinterTest {
  2. public static void main(String[] args) {
  3. usePrinter(s -> System.out.println(s.toUpperCase()));
  4. //引用对象的实例方法
  5. PrintString ps = new PrintString();
  6. usePrinter(ps::printUpper);
  7. //Lambda表达式被对象的实例方法替代的时候,它的形式参数全部传递给该方法作为参数
  8. }
  9. private static void usePrinter(Printer p) {
  10. p.printUpperCase("hello,world!");
  11. }
  12. }

6. 引用类的实例方法

引用类的实例方法,其实就是引用类中的成员方法

格式:类名::成员方法

范例:String::substring

  • String类中的方法:public String substring(int beginIndex,int endIndex)
  • 从beginIndex开始到endIndex结束,截取字符串,返回一个子串,子串的长度为endIndex-beginIndex

练习

  • 定义一个接口(MyString),里面定义一个抽象方法

                String mySubString(String s,int x,int y)

  • 定义一个测试类(MyStringTest),在测试类中提供两个方法

                一个方法是:useMyString(MyString my)

                一个方法主方法,在主方法中调用useMyString方法

实例:

  1. public class MyStringTest {
  2. public static void main(String[] args) {
  3. // useMyString((String s,int x,int y) -> {
  4. // return s.substring(x,y);
  5. // });
  6. useMyString((s,x,y) -> s.substring(x,y));
  7. //引用类中的实例方法
  8. useMyString(String::substring);
  9. //Lambda表达式被勒的实例方法替代的时候
  10. //第一个参数作用调用者
  11. //后面的参数全部传递给该方法作为参数
  12. }
  13. private static void useMyString(MyString my) {
  14. String s = my.mySubString("hello,world!", 2, 5);
  15. System.out.println(s);
  16. }
  17. }

7.引用构造器

引用构造器,其实就是引用构造方法

格式:类名::new

范例:Student::new

练习:

  • 定义一个类(Student),里面有两个成员变量(name,age),并提供无参构造方法和带参构造方法,以及成员变量对应的get和set方法
  • 定义一个接口(StudentBuilder),里面定义一个抽象方法,Student build(String name,int age);
  • 定义一个测试类(StudentTest),在测试类中提供两个方法

                一个方法是:useStudentBuilder(StudentBuilder s)

                一个方法主方法,在主方法中调用useStudentBuilder方法

实例:

  1. public class StudentTest {
  2. public static void main(String[] args) {
  3. useStudentBuilder((String name,int age) -> {
  4. return new Student(name,age);
  5. });
  6. useStudentBuilder(Student::new);
  7. //Lambda表达式被构造器替代的时候,它的形式参数全部传递个构造器作为参数
  8. }
  9. private static void useStudentBuilder(StudentBuilder s) {
  10. Student stu = s.build("周星驰", 56);
  11. System.out.println(stu.getName() + stu.getAge());
  12. }
  13. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/53260
推荐阅读
相关标签
  

闽ICP备14008679号