Java中的::是什么语法?
这是Java 8中的方法引用
-
静态方法引用,通过类名:静态方法名,如lnteger::parseInt
-
实例方法引用,通过实例对象::实例方法,如str::substring
-
构造方法引用,通过类名::new, 如User::new
方法引用是一种函数式接口的另-种书写方式。
方法引用是什么?
方法引用是只需要使用方法的名字,而具体调用交给函数式接口,需要和Lambda表达式配合使用。
如:
List<String> list = Arrays.asList("a","b","c","d");
list.forEach(s -> System.out.println(s));
list.forEach(System.out::println);
上面两种写法是等价的。
示例
往User类添加方法引用方法:
@Data
public class User {
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public static User create(Supplier<User> supplier) {
return supplier.get();
}
public static void updateUserName(User user) {
user.setName(user.getName() + " update");
}
public void updateAge() {
this.setAge(this.getAge() + 10);
}
public void changeAge(User user) {
user.setAge(user.getAge() + 10);
}
}
方法引用测试:
List<User> list = new ArrayList<>();
list.add(new User("xw",18));
list.add(new User("xz",34));
list.add(new User("xl",19));
list.add(new User("lh",24));
list.add(new User("lp",31));
//构造器方法引用
User newUser = User.create(User::new);
newUser.setAge(1);
newUser.setName("new");
System.out.println(newUser);
//类静态方法引用
list.forEach(User::updateUserName);
//类普通方法引用
list.forEach(User::updateAge);
//实例方法引用
User user = new User();
list.forEach(user::changeAge);
list.forEach(System.out::println);
输出结果:
User(name=new, age=1)
User(name=xw update, age=38)
User(name=xz update, age=54)
User(name=xl update, age=39)
User(name=lh update, age=44)
User(name=lp update, age=51)
可以看出方法引用都生效了,username和age都相应更新了。
方法引用分为哪几类?
方法引用分类:
1.构造器方法引用
格式:Class::new ,调用默认构造器
2.类静态方法引用
格式: Class::static_method
3.类普通方法引用
格式: Class::method
4.实例方法引用
格式: Instance::method