java8 新特性之方法引用简介说明
一、方法引用的简介
方法引用是java8的新特性之一可以直接引用已有Java类或对象的方法或构造器
当方法引用同Lambda表达式一起使用时,可使代码更加简洁例:
public static void main(String[] args) { list<String> strList = Arrays.asList(new String[] { "j", "a", "v","a" }); strList.stream().sorted((s1, s2) -> s1.compareToIgnoreCase(s2)).forEach(s -> System.out.println(s)); } /*字符串遍历排序并打印 可修改为方法引用的样式,如下所示: */ public static void main(String[] args) { List<String> strList = Arrays.asList(new String[] { "a", "c", "b" }); strList.stream().sorted(String::compareToIgnoreCase).forEach(System.out::println); }
从以上改进的代码中,我们可以看出, 采用方法引用的方式可简化lambda表达式的写法
二、方法引用常用的写法
java8方法引用有四种形式:-
静态方法引用 : ClassName :: staticMethodName
构造器引用 : ClassName :: new
类的任意对象的实例方法引用: ClassName :: instanceMethodName
特定对象的实例方法引用 : object :: instanceMethodName
lambda表达式之方法引用的场景 1.lambda表达式中只包含一个表达式,且这个表达式调用一个已存在的方法 2.方法引用的入参和返回值需同lambda表达式的函数入参和返回值一致
静态方法引用
静态方法引用的语法格式为: 类名::静态方法名 ,如 System.out::println 等同于 lambda表达式 s -> System.out.println(s)例:
public class TestMain { public static void main(String[] args) { //lambda表达式使用: Arrays.asList(new String[] {"j", "a", "v","a"}).stream().forEach(s -> Test.println(s)); //静态方法引用: Arrays.asList(new String[] {"j", "a", "v","a"}).stream().forEach(Test::println); } public static void println(String s) { System.out.println(s); } }
构造器引用
 构造器引用的语法格式为: 类名::new ,如() -> new ArrayList<String>() 等价于 ArrayList<String>::new,例:
Che<List<String>> che1= () -> new ArrayList<String>(); 等价于 Che<List<String>> che = ArrayList<String>::new;构造器引用适用于lambda表达式主体中
只调用了某个类的构造函数返回实例的场景
类的任意对象的实例方法引用
 类的任意对象的实例方法引用的语法格式为: 类名::实例方法名 , 这种方法引用相对比较复杂,我们来看示例:例:
Arrays.sort(strs,(s1,s2)->s1.compareToIgnoreCase(s2)); --------其效果等同于------------ Arrays.sort(strs, String::compareToIgnoreCase);例:
public class Student { private String name; private Integer score; public void setNameAndScore(String name, Integer score) { this.name = name; this.score = score; System.out.println("Student "+ name +"'s score is " + score); } public static void main(String[] args) { /*lambda表达式的用法: TestInterface testInterface = (student, name, score) -> student.setNameAndScore(name, score);*/ //类的任意对象的实例方法引用的用法: TestInterface testInterface = Student::setNameAndScore; testInterface.set(new Student(), "DoubleBin", 100); } @FunctionalInterface interface TestInterface { // 注意:入参比Student类的setNameAndScore方法多1个Student对象,除第一个外其它入参类型一致 public void set(Student d, String name, Integer score); } }
方法引用的特性 1.方法引用的通用特性:方法引用所使用方法的入参和返回值与lambda表达式实现的函数式接口的入参和返回值一致; 2.lambda表达式的第一个入参为实例方法的调用者,后面的入参与实例方法的入参一致
方法引用总结
方法引用使用运算符::连接类(或对象)方法名称(或new)实现在特定场景下lambda表达式的简化表示使用时要注意方法引用的使用场景及各种方法引用的特性
使用方法引用的优点使代码更简洁
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。