本篇内容主要讲解“Lambda表达式的方法和构造器怎么引用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Lambda表达式的方法和构造器怎么引用”吧!
了解了 Lambda 表达式有一段时间了,但是都没有怎么练习,一直停留在最低层次的了解程度,这对于追求技术进步的人来说确实不是太好,所以就来继续深入学习以下。
使用要求:
如果Lambda表达式的代码块只有一条代码,程序就可以省略 Lambda 表达式中的代码块和花括号,还可以使用方法引用与构造器引用。
作用:
方法引用与构造器引用可以使 Lambda 表达式的代码块更加简洁(可能代码越短越好吧!)
使用:
方法引用与构造器引用都需要使用两个冒号::
种类 | 示例 | 说明 |
引用类方法 | Integer::valueOf | 函数式接口中被实现方法的全部参数传给该类方法作为参数 |
引用特定对象的实例方法 | System.out::println | 函数式接口中被实现方法的全部参数传给该方法作为参数 |
引用某类对象的实例方法 | System.out::println | 函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数 |
引用构造器 | Dog::new | 函数式接口中被实现方法的全部参数传给该构造器作为参数 |
定义需要使用的函数式接口
@FunctionalInterface interface Instance<E>{ E get(String name, int age); } @FunctionalInterface interface Converter{ Integer converter(String age); } @FunctionalInterface interface Say{ String say(Dog dog, String hobby); }
定义一个 Dog 类,作为示例使用
class Dog{ private String name; private int age; public Dog(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void grow(Converter con, String age) { this.age = con.converter(age); } public int getNameLength(String name) { return name.length(); } public String hobby(String hobby) { return this.toString()+" I love "+hobby; } @Override public String toString() { return "Dog [name=" + name + ", age=" + age + "]"; } }
测试代码
我把没有使用方法引用和构造器引用的代码注释了,并且就放在 Lambda 表达式上面,用作对比参考。
public class Client { public static void main(String[] args) { //使用方法引用和构造器引用使得 Lambda 表达式更加简洁 /* * 1.引用构造器 * */ //Instance<Dog> instance1 = (name, age)->new Dog(name,age); Instance<Dog> instance = Dog::new; Dog dog = instance.get("小黑", 12); String str = dog.toString(); System.out.println(str); /* * 2.引用类方法 * */ //Converter converter1 = age->Integer.valueOf(age); Converter converter1 = Integer::valueOf; dog.grow(converter1,"18"); System.out.println(dog.toString()); /* * 3.引用特定对象的实例方法 * */ //Converter converter2 = name->dog.getNameLength(name); Converter converter2 = dog::getNameLength; int len = converter2.converter(dog.getName()); System.out.println("dog 的名字有:"+len+" 个字符!"); /* * 4.引用某类对象的实例方法 * */ //Say say1 = (dog1,hobby)->dog1.hobby(hobby); Say dogSay = Dog::hobby; String str1 = dogSay.say(dog, "running!"); System.out.println(str1); } }
运行截图
学以致用
学习是为了更好的理解,下面来举一个简单的例子,来看看这个的应用。
**忽略这里的 Comparable接口 **
public class Dog implements Comparable<Dog>{ private String name; private int age; public Dog(String name, int age) { this.name = name; this.age = age; } public int getAge() { return age; } @Override public int compareTo(Dog dog) { return this.age > dog.age ? 1 : this.age < dog.age ? -1 : 0; } @Override public String toString() { return "Dog [name=" + name + ", age=" + age + "]"; } }
测试代码
public class ClientTest { public static void main(String[] args) { LinkedList<Dog> list = new LinkedList<>(); list.add(new Dog("大黄",12)); list.add(new Dog("小黑",13)); list.add(new Dog("二哈",11)); list.add(new Dog("小白",9)); list.add(new Dog("旺财",8)); //引用特定对象的实例方法 Consumer<Dog> consumer = System.out::println; list.forEach(consumer); System.out.println("-------模拟上面的 foreach 方法-----------"); Consumer<Dog> con = dog->System.out.println(dog); for (Dog dog : list ) { con.accept(dog); } } }
说明
注意上面那个方法list.forEach(consumer);
这个方法的参数是一个函数式接口对象,就是传入一个 lambda 表达式,它本身是使用了 方法引用(引用特定对象的方法 System.out
是 PrintStream
的对象),但是为什么传入一个 接口对象就能实现打印输出(也可以根据自己写的 Lambda 表达式 完成具体功能)?
保持对问题的好奇心,可以思考以下,下面是我模拟的结果,因为最终要完成还是需要借助于方法来进行的,可以打开 Consumer
接口,里面只有一个 accept
方法,很容易就能想到,借助 foreach 循环进行遍历操作。
我们查看 list.forEach
的 API 就能看出来,实现大致如此,只不过加了一个null
值处理。
运行结果:
到此,相信大家对“Lambda表达式的方法和构造器怎么引用”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。