前言
在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!”
博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
方法引用
Java8引入了方法引用,其使用场景是,当我们使用lambda时,如果方法体中只有一个方法调用(包括构造方法),我们可以使用方法引用进一步简化代码。Java8中提供了四种不同类型的方法引用:静态方法引用,实例方法引用,构造方法引用。下面我们就来介绍这些方法引用。
1. 静态方法引用
基本格式:类名::方法名
使用前提
如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个类的静态方法,并且我们把要重写的抽象方法中所有的参数都按照顺序传入了这个静态方法中,这个时候我们就可以引用类的静态方法。
示例代码
代码语言:javascript复制public class Demo8 {
public static void main(String[] args) {
List<User> users = Arrays.asList(new User("张三", "2222"), new User("李四", "3333")
, new User("王五", "4444"));
List<Integer> collect = users.stream().map(user -> user.getPassword()).map(Integer::valueOf).collect(Collectors.toList());
System.out.println(collect);
}
}
2. 引用对象的实例方法
基本格式:对象名::方法名
使用前提
如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个对象的成员方法,并且我们把要重写的抽象方法中所有的参数都按照顺序传入了这个成员方法中,这个时候我们就可以引用对象的实例方法
示例代码
代码语言:javascript复制public class Demo8 {
public static void main(String[] args) {
List<User> users = Arrays.asList(new User("张三", "2222"), new User("李四", "3333")
, new User("王五", "4444"));
StringBuilder sb= new StringBuilder();//创建对象
users.stream().map(user->user.getUsername())
.forEach(sb::append);//使用方法
}
}
3. 引用类的实例方法
基本格式:类名::方法名
使用前提
如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了第一个参数的成员方法,并且我们把要重写的抽象方法中剩余的所有的参数都按照顺序传入了这个成员方法中,这个时候我们就可以引用类的实例方法。
示例代码
代码语言:javascript复制public class Demo9 {
public static String subAuthorName(String str, UseString useString){
int start = 0;
int length = 1;
return useString.use(str,start,length);
}
public static void main(String[] args) {
subAuthorName("bbbb", String::substring);
}
interface UseString{
String use(String str,int start,int length);
}
}
4. 构造器引用
如果方法体中的一行代码是构造器的话就可以使用构造器引用。
基本格式:类名::new
使用前提
如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个类的构造方法,并且我们把要重写的抽象方法中的所有的参数都按照顺序传入了这个构造方法中,这个时候我们就可以引用构造器。
示例代码
代码语言:javascript复制public class Demo8 {
public static void main(String[] args) {
List<User> users = Arrays.asList(new User("张三", "2222"), new User("李四", "3333")
, new User("王五", "4444"));
users.stream().map(User::getUsername).map(StringBuilder::new)
.map(sb->sb.append("cdd").toString()).forEach(System.out::println);
}
}