Java8新特性(2).方法引用

一、什么是方法引用

1.什么是方法引用
  • 直接访问类或者实例的已经存在的方法或者构造方法。
  • 方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。
  • 计算时,方法引用会创建函数式接口的一个实例
2.方法引用的格式
  • 实例对象::方法名
  • 类名::方法名

二、方法引用的形式

方法引用主要与stream流处理一起使用,实现数据的筛选过滤等

1.构造方法引用

形式为 ClassName::new

(1)构造器方法引用
  • 定义一个商品实体类
  • 定义一个生成商品对象的工厂接口
  1. class GoodsItem {
  2. private Long itemId;
  3. private String itemName;
  4. private String itemHashName;
  5. private static final String DEFAULT_TYPE = "GOODS";
  6. public Long getItemId() {
  7. return itemId;
  8. }
  9. public void setItemId(Long itemId) {
  10. this.itemId = itemId;
  11. }
  12. public String getItemName() {
  13. return itemName;
  14. }
  15. public void setItemName(String itemName) {
  16. this.itemName = itemName;
  17. }
  18. public String getItemHashName() {
  19. return itemHashName;
  20. }
  21. public void setItemHashName(String itemHashName) {
  22. this.itemHashName = itemHashName;
  23. }
  24. public GoodsItem() {
  25. }
  26. public GoodsItem(Long itemId) {
  27. this.itemId = itemId;
  28. }
  29. public GoodsItem(Long itemId, String itemName) {
  30. this(itemId);
  31. this.itemName = itemName;
  32. }
  33. public GoodsItem(Long itemId, String itemName, String itemHashName) {
  34. this(itemId, itemName);
  35. this.itemHashName = itemHashName;
  36. }
  37. public static String getDefaultType() {
  38. return DEFAULT_TYPE;
  39. }
  40. @Override
  41. public String toString() {
  42. return "GoodsItem{" +
  43. "itemId=" + itemId +
  44. ", itemName='" + itemName + '\'' +
  45. ", itemHashName='" + itemHashName + '\'' +
  46. '}';
  47. }
  48. }
  49. @FunctionalInterface
  50. interface GoodsItemFactory {
  51. GoodsItem create(Long itemId, String itemName, String itemHashName);
  52. }
  • 构造器引用
  1. /**
  2. * 1.1 构造器引用
  3. */
  4. /**
  5. * 1.1.1 使用自定义的函数式接口来接收构造器引用
  6. */
  7. GoodsItemFactory goodsItemFactory = GoodsItem::new;
  8. GoodsItem goodsItem = goodsItemFactory.create(3895678001L, "MacPro 2018", "mac_pro_2018");
  9. System.out.println(goodsItem);
  10. /**
  11. * 1.1.2 使用函数式接口Function来接收构造器引用
  12. */
  13. Function<Long, GoodsItem> goodsItemFunction = GoodsItem::new;
  14. GoodsItem goodsItem2 = goodsItemFunction.apply(51784578002L);
  15. System.out.println(goodsItem2);
  • GoodsItem::new 类似于new GoodsItem这个构造函数,返回的是一个Function类型
(2)数组引用
  1. /**
  2. * 1.2 数组引用
  3. */
  4. Function<Integer, int[]> arrayFunc = int[]::new;
  5. int[] arr = arrayFunc.apply(10);
  6. System.out.println(arr.length);

以上的例子类似于 new int[10];

2.静态方法引用

形式:类名::静态方法名

  1. List<GoodsItem> goodsItemList = new ArrayList<GoodsItem>(2);
  2. goodsItemList.add(new GoodsItem(10003L, "Mac Pro 2018", "mac_pro_2018"));
  3. goodsItemList.add(new GoodsItem(10002L, "MI Pro 2018", "mi_pro_2018"));
  4. goodsItemList.sort(Comparator.comparing(GoodsItem::getItemId));
3.实例方法引用

形式:

  • 类名::实例方法
  • 类对象::实例方法
(1)通过类名引用实例方法
  1. List<GoodsItem> goodsItemList = new ArrayList<GoodsItem>(2);
  2. goodsItemList.add(new GoodsItem(10003L, "Mac Pro 2018", "mac_pro_2018"));
  3. goodsItemList.add(new GoodsItem(10002L, "MI Pro 2018", "mi_pro_2018"));
  4. goodsItemList.sort(Comparator.comparing(GoodsItem::getItemId));
4.某个类型任意对象的实例方法引用

形式:

  • 类名::方法名称
  1. String[] arr = new String[]{"7", "2", "5", "3", "4"};
  2. Arrays.sort(arr, String::compareTo);
  3. for (int i = 0; i< arr.length; i++) {
  4. System.out.println(arr[i]);
  5. }