写最紧凑的代码—方法引用
方法引用其实也是Lambda的一种,但是他比Lambda表达式更加紧凑。
方法引用的操作符为::
,对于方法的引用有一下四种方式
-
静态方法引用
基本语法
Class::static_method
实例:
创建一个Book类方便于演示
package com.yunshan; /** * @Author zhangminghui * @Date 2020/12/10 15:54 */ public class Book { private String id; private String name; public Book() { } public Book(String name) { this.name = name; } public Book(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public static int compareById(Book b1,Book b2){ return b1.getId().compareTo(b2.getId()); } public int compareById(Book book){ return this.getId().compareTo(book.getId()); } }
创建几个Book对象,使用Book对象的id进行排序
@Test public void Test_001(){ Book b1 = new Book("202032","java编程思想"); Book b2 = new Book("202011","C++入门"); Book b3 = new Book("202001","计算机网络"); List<Book> list = Arrays.asList(b1,b2,b3); list.sort(Book::compareByIdStatic); list.forEach(book -> System.out.println(book.getName())); }
运行结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w4VS5C55-1607739945047)(C:\Users\zhangminghui\AppData\Roaming\Typora\typora-user-images\image-20201210161909485.png)]
-
特定对象的方法引用
基础语法:
instance::method
示例:
定义一个类去做Book的ID比较,这个类中的方法是非静态的
package com.yunshan; /** * @Author zhangminghui * @Date 2020/12/10 16:15 */ public class CompareBook { public int compareById(Book b1, Book b2) { return b1.getId().compareTo(b2.getId()); } }
按照id排序
@Test public void Test_002(){ Book b1 = new Book("202032","java编程思想"); Book b2 = new Book("202011","C++入门"); Book b3 = new Book("202001","计算机网络"); List<Book> list = Arrays.asList(b1,b2,b3); CompareBook compareBook = new CompareBook(); list.sort(compareBook::compareById); list.forEach(book -> System.out.println(book.getName())); }
运行结果如下:
-
特定类的任意对象的方法引用
基本语法:
Class::method
示例:
@Test public void Test_003(){ Book b1 = new Book("202032","java编程思想"); Book b2 = new Book("202011","C++入门"); Book b3 = new Book("202001","计算机网络"); List<Book> list = Arrays.asList(b1,b2,b3); list.sort(Book::compareById); list.forEach(book -> System.out.println(book.getName())); }
运行结果如下:
-
构造方法引用
基本语法:
Class::new
或者Class<T>::new
示例:
@Test public void Test_004() { // 无参构造 Supplier<Book> supplier = Book::new; // 一个参数的构造 Function<String, Book> function = Book::new; Book java = function.apply("Java"); System.out.println(java.getName()); // 两个参数的构造 BiFunction<String, String, Book> biFunction = Book::new; Book c = biFunction.apply("202011", "C语言"); System.out.println("ID: " + c.getId() + " name: " + c.getName()); }
运行结果如下:
方法引用将代码压缩到了极简的状态,使你的代码变得更加高大上,行动起来,用方法引用优化你的代码!