Java8 方法引用的使用

####一、方法引用分类

1.构造函数 2.静态方法 3.实例方法(类型) 4.实例方法(对象)

####二、方法引用-构造函数 ClassName::new,示例:

/** * @author Kevin * @date 2017-01-24 */ public class ConstructorTest { public static void main(String[] args) { Function<String, String> function = String::new; System.out.println(function.apply("SpaceX")); } }

####三、方法引用-静态方法 ClassName::staticMethodName,示例:

/** * @author Kevin * @date 2017-01-24 */ public class StaticMethodTest { public static void main(String[] args) { Function<Integer, String> function = String::valueOf; System.out.println(function.apply(1001)); } }

####三、方法引用-实例方法(类型) ClassName::instanceMethodName,示例:

/** * @author Kevin * @date 2017-01-24 */ public class ClassNameInstanceMethodTest { public static void main(String[] args) { Function<String, Integer> function = String::length; System.out.println(function.apply("Google")); } }

####四、方法引用-实例方法(对象) object::instanceMethodName,示例:

/** * 公司 * * @author Kevin * @date 2017-01-24 */ public class Company { /** * 编码 */ private String code; /** * 公司名称 */ private String name; public Company() { } public Company(String name, String code) { this.name = name; this.code = code; } public static int compareByCode(Company a, Company b) { return a.getCode().compareTo(b.getCode()); } @Override public String toString() { return "Company{" + "code='" + code + '\'' + ", name='" + name + '\'' + '}'; } /** * 生产 * * @author Kevin */ String produce(String productName) { return getName() + " produces " + productName; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } } /** * @author Kevin * @date 2017-01-24 */ public class ObjectInstanceMethodTest { public static void main(String[] args) { Company company = new Company(); company.setName("Apple"); Function<String, String> converter = company::produce; System.out.println(converter.apply("iPhone 7")); } }

五、方法引用的综合使用

/** * Java8 方法引用 * * @author Kevin * @date 2017-01-24 */ public class MethodReferencesTest { public static void main(String[] args) { List<Company> companyList = new ArrayList<>(); companyList.add(new Company("Google", "1002")); companyList.add(new Company("SpaceX", "1001")); companyList.add(new Company("Apple", "1003")); System.out.println("------companyList------"); companyList.forEach(System.out::println); Company[] listAsArray = companyList.toArray(new Company[companyList.size()]); // 不使用方法引用 Arrays.sort(listAsArray, new Comparator<Company>() { @Override public int compare(Company a, Company b) { return a.getCode().compareTo(b.getCode()); } }); // 使用lambada表达式 Arrays.sort(listAsArray, (Company a, Company b) -> { return a.getCode().compareTo(b.getCode()); } ); // 方法引用(静态方法) Arrays.sort(listAsArray, Company::compareByCode); System.out.println("------listAsArray------"); for (int i = 0; i < listAsArray.length; i++) { System.out.println(listAsArray[i]); } class ComparisonProvider { public int compareByName(Company a, Company b) { return a.getName().compareTo(b.getName()); } } ComparisonProvider comparisonProvider = new ComparisonProvider(); // 方法引用(实例方法) Arrays.sort(listAsArray, comparisonProvider::compareByName); // 使用lambada表达式构造函数 Set<Company> companySetLambda = transferElements(companyList, () -> { return new HashSet<>(); }); System.out.println("------companySetLambda------"); companySetLambda.forEach(System.out::println); // 使用new运算符构造函数 Set<Company> companySet = transferElements( companyList, HashSet::new); System.out.println("------companySet------"); companySet.forEach(System.out::println); } /** * 将集合中的元素复制到另一个集合 * * @author Kevin */ public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>> DEST transferElements( SOURCE sourceCollection, Supplier<DEST> collectionFactory) { DEST result = collectionFactory.get(); for (T t : sourceCollection) { result.add(t); } return result; } } /** * 公司 * * @author Kevin * @date 2017-01-24 */ public class Company { /** * 编码 */ private String code; /** * 公司名称 */ private String name; public Company() { } public Company(String name, String code) { this.name = name; this.code = code; } public static int compareByCode(Company a, Company b) { return a.getCode().compareTo(b.getCode()); } @Override public String toString() { return "Company{" + "code='" + code + '\'' + ", name='" + name + '\'' + '}'; } /** * 生产 * * @author Kevin */ String produce(String productName) { return getName() + " produces " + productName; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

六、参考文章

1.Method References (http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html)

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

java构造方法

1.构造方法(函数)就是用来构造对象的方法,分为有参和无参两个类型。例如下面例子a.HellohellonewHello(); b.HellohellonewHello(Stringname); a是一个无参的构造方法,b是传入一个参数是string的构造方法。两者都是用来实例化对象。实例化对象的格式可以是:Class

Java8特性

Java8又称jdk1.8。主要新特性:Lambda表达式 −Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。方法引用 −方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

Java8 方法引用的使用 - HelloWorld