【java8新特性 简述】方法引用“::”表达式
2018-10-22 本文已影响0人
浪漫宇宙与人间日常
java8的方法引用是一种编码格式,通常结合lambda表达式一起使用,结合一起使用会进一步减少代码量,使得代码更加简洁
简单实例
- 不使用lambda表达式和方法引用
public static void main(String[] args) {
List<String> strList = Arrays.asList(new String[] { "a", "c", "b" });
strList.stream().sorted((s1, s2) -> s1.compareToIgnoreCase(s2)).forEach(s -> System.out.println(s));
}
相信上面的编码风格大家都已经能够比较熟练地知道其中的意思了。
- 使用lambda表达式和方法引用
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);
}
可以比较看出来,两种编码的风格上会有更多不同,然后后者可能编写代码更少,看起来更加清爽,前提是你了解java8的一些新特性
接着,我们就一起来学习java8关于方法引用的一些语法吧!(内容非常简洁)
方法引用
java8方法引用有四种形式:
静态方法引用 : ClassName :: staticMethodName
构造器引用 : ClassName :: new
类的任意对象的实例方法引用: ClassName :: instanceMethodName
特定对象的实例方法引用 : object :: instanceMethodName
就是上面的四种方式,下面将给出四种使用的简单实例
- 静态方法引用
//lambda表达式使用:
Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(s -> Test.println(s));
//静态方法引用:
Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(Test::println);
适用于lambda表达式主体中仅仅调用了某个类的静态方法的情形
- 构造器引用
Supplier<List<String>> supplier1= () -> new ArrayList<String>();
//等价于
Supplier<List<String>> supplier = ArrayList<String>::new;
适用于lambda表达式主体中仅仅调用了某个类的构造函数返回实例的场景。
- 类的任意对象的实例方法引用
Arrays.sort(strs,(s1,s2)->s1.compareToIgnoreCase(s2));
// 等价于
Arrays.sort(strs, String::compareToIgnoreCase);
- 方法引用的通用特性:方法引用所使用方法的入参和返回值与lambda表达式实现的函数式接口的入参和返回值一致;
- lambda表达式的第一个入参为实例方法的调用者,后面的入参与实例方法的入参一致。
- 特定对象的实例方法引用
// lambda表达式使用:
Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(s -> test.println(s));
// 特定对象的实例方法引用:
Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(test::println);
适用于lambda表达式的主体中仅仅调用了某个对象的某个实例方法的场景。
这种代码的编写方式并不被所有的人喜欢,每个人的看法不一样,有的人并不能很好的理解这种写法,所以大家自己根据自己的情况酌情使用。