Java8引入了方法引用的新特性,简化应用对象方法的调用。方法引用用于直接访问类或实例已有的方法或构造方法。方法引用提供了一种在不执行方法的情况下引用方法的方法,需要由兼容的功能接口组成的目标类型上下文。评估时,方法引用会创建功能接口的实例。当lambda表达式仅用于执行方法调用时,不使用lambda表达式直接传递方法引用更具可读性。方法引用是lambda表达式的一种更简洁易懂的版本。1、语法目标引用:方法名目标引用:类名、实例对象方法名:实例方法名、静态方法名等价的lambda方法引用示例如下:2、方法引用分类在Java8中,方法主要有四种类型referencesClass:构造函数引用Class::new静态方法引用Class::static_method实例对象方法引用Instance::method任何特定类型Class::method对象的实例方法引用3.构造函数引用语法为Class::new,或者更一般的Class::new实例如下:/***Lambda表达式实例化User对象*/Suppliers01=()->newUser();Functionf01=(id)->{returnnewUser(id);};f01.apply(2019);BiFunctionbf01=(id,uname)->{returnnewUser(id,uname);};bf01.apply(2019,"admin");//方法参考等效写法Suppliers02=User::new;Functionf02=User::new;f02.apply(2019);BiFunction<整数,字符串,用户>bf02=User::new;bf02.apply(2019,"admin");四、静态方法引用语法为Class::static_method,示例如下://判断字符串是否为空字符串Functionf03=(str)->StringUtils.isBlank(str);System.out.println(f03.apply(""));//Base64对输入字符串进行编码操作Suppliers01=()->Base64.getEncoder();s01.get().encodeToString("java8太简单了!!!".getBytes());Functionf04=StringUtils::isBlank;System.out.println(f04.apply(""));Suppliers02=Base64::getEncoder;s02.get().encodeToString("java8太简单了!!!".getBytes());5.实例对象方法引用语法为Instance::method,引用方法时必须使用实例有实例,示例如下://方法引用构造用户对象BiFunctionbf02=User::new;Useru02=bf02.apply(2019,"admin");//调用实例对象方法Suppliers01=()->u02.getUserName();System.out.println(s01.get());//方法引用等同于Lambda写法Suppliers02=u02::getUserName;System.out.println(s02.get());6、任何一个特定类型的对象的实例方法引用语法都是Class::method。第四种是特殊的。这里的具体类型指的是多个对象类型,对象类型属于同一个类类型通常是一个集合,元素类型相同,此时可以实现对类方法的引用/**准备测试数据**/Listlist=Arrays.asList(10,2,30,5,8,10,60,99,101);Listemails=Arrays.asList("126@126.com","","","java8@163.com");Goodsg01=newGoods(1,"小米9",1789,200,BigDecimal.valueOf(2500));Goodsg02=newGoods(2,"HuaweiMate20",5000,3000,BigDecimal.valueOf(7000));Goodsg03=newGoods(3,"OPPOR17",2000,2827,BigDecimal.valueOf(1500));Goodsg04=newGoods(4,"魅族Note9",2000,1600,BigDecimal.valueOf(1600));Goodsg05=newGoods(5,"OnePlus6T",8000,5000,BigDecimal.valueOf(3500));Listgoods=Arrays.asList(g01,g02,g03,g04,g05);//Lambda对集合列表元素进行排序list存储整数元素list.sort((a1,a2)->a1-a2);//Lambda对集合物品进行排序按销量排序goods.sort((g1,g2)->g1.getSale()-g2.getSale());//过滤邮箱集合空字符串emails.stream().filter((e)->StringUtils.isNoneBlank(e)).collect(Collectors.toList());//任意对象的实例方法引用对集合列表元素进行排序list.sort(Comparator.comparing(Integer::intValue));//任意对象的实例方法引用按销售额对集合商品进行排序。goods.sort(Comparator.comparing(Goods::getSale));//过滤邮箱空字符串集合emails.stream().filter(StringUtils::isNoneBlank).collect(Collectors.toList());7.方法引用应用方法引用简化了Lambda表达式的写法,方法引用可以用于函数式接口实现替代Lambda,掌握Lambda后使用方法引用时,代码会变得更加简洁自然写法,用于函数式接口实现,可以用方法引用代替Lambda。当你掌握Lambda并使用方法引用时,代码会变得更加简洁自然。