一、什么是方法引用
1.什么是方法引用
- 直接访问类或者实例的已经存在的方法或者构造方法。
- 方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。
- 计算时,方法引用会创建函数式接口的一个实例
2.方法引用的格式
- 实例对象::方法名
- 类名::方法名
二、方法引用的形式
方法引用主要与stream流处理一起使用,实现数据的筛选过滤等
1.构造方法引用
形式为 ClassName::new
(1)构造器方法引用
- 定义一个商品实体类
- 定义一个生成商品对象的工厂接口
class GoodsItem {
private Long itemId;
private String itemName;
private String itemHashName;
private static final String DEFAULT_TYPE = "GOODS";
public Long getItemId() {
return itemId;
}
public void setItemId(Long itemId) {
this.itemId = itemId;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public String getItemHashName() {
return itemHashName;
}
public void setItemHashName(String itemHashName) {
this.itemHashName = itemHashName;
}
public GoodsItem() {
}
public GoodsItem(Long itemId) {
this.itemId = itemId;
}
public GoodsItem(Long itemId, String itemName) {
this(itemId);
this.itemName = itemName;
}
public GoodsItem(Long itemId, String itemName, String itemHashName) {
this(itemId, itemName);
this.itemHashName = itemHashName;
}
public static String getDefaultType() {
return DEFAULT_TYPE;
}
@Override
public String toString() {
return "GoodsItem{" +
"itemId=" + itemId +
", itemName='" + itemName + '\'' +
", itemHashName='" + itemHashName + '\'' +
'}';
}
}
@FunctionalInterface
interface GoodsItemFactory {
GoodsItem create(Long itemId, String itemName, String itemHashName);
}
- 构造器引用
/**
* 1.1 构造器引用
*/
/**
* 1.1.1 使用自定义的函数式接口来接收构造器引用
*/
GoodsItemFactory goodsItemFactory = GoodsItem::new;
GoodsItem goodsItem = goodsItemFactory.create(3895678001L, "MacPro 2018", "mac_pro_2018");
System.out.println(goodsItem);
/**
* 1.1.2 使用函数式接口Function来接收构造器引用
*/
Function<Long, GoodsItem> goodsItemFunction = GoodsItem::new;
GoodsItem goodsItem2 = goodsItemFunction.apply(51784578002L);
System.out.println(goodsItem2);
- GoodsItem::new 类似于new GoodsItem这个构造函数,返回的是一个Function类型
(2)数组引用
/**
* 1.2 数组引用
*/
Function<Integer, int[]> arrayFunc = int[]::new;
int[] arr = arrayFunc.apply(10);
System.out.println(arr.length);
以上的例子类似于 new int[10];
2.静态方法引用
形式:类名::静态方法名
List<GoodsItem> goodsItemList = new ArrayList<GoodsItem>(2);
goodsItemList.add(new GoodsItem(10003L, "Mac Pro 2018", "mac_pro_2018"));
goodsItemList.add(new GoodsItem(10002L, "MI Pro 2018", "mi_pro_2018"));
goodsItemList.sort(Comparator.comparing(GoodsItem::getItemId));
3.实例方法引用
形式:
类名::实例方法
类对象::实例方法
(1)通过类名引用实例方法
List<GoodsItem> goodsItemList = new ArrayList<GoodsItem>(2);
goodsItemList.add(new GoodsItem(10003L, "Mac Pro 2018", "mac_pro_2018"));
goodsItemList.add(new GoodsItem(10002L, "MI Pro 2018", "mi_pro_2018"));
goodsItemList.sort(Comparator.comparing(GoodsItem::getItemId));
4.某个类型任意对象的实例方法引用
形式:
类名::方法名称
String[] arr = new String[]{"7", "2", "5", "3", "4"};
Arrays.sort(arr, String::compareTo);
for (int i = 0; i< arr.length; i++) {
System.out.println(arr[i]);
}