Java8 方法引用的使用

Wesley13
• 阅读 694

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

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)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java构造方法
1.构造方法(函数)就是用来构造对象的方法,分为有参和无参两个类型。例如下面例子a.HellohellonewHello(); b.HellohellonewHello(Stringname); a是一个无参的构造方法,b是传入一个参数是string的构造方法。两者都是用来实例化对象。实例化对象的格式可以是:Class
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
Java8特性
Java8又称jdk1.8。主要新特性:Lambda表达式 −Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。方法引用 −方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java8之Stream
在使用Stream之前先介绍几个概念:1、函数式接口2、常用的函数式接口3、Lambda4、方法引用 1、函数式接口  1.只定义了一个抽象方法的接口。  2.JDK8接口中的静态方法和默认方法,都不算是抽象方法。  3.接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,
Wesley13 Wesley13
3年前
Java日期时间API系列30
  实际使用中,经常需要使用不同精确度的Date,比如保留到天2020042300:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyyMMdd),然后再解析为Date。Java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用Format方法、 使用Of方法和使用With方法,性能对比,使用
Wesley13 Wesley13
3年前
C#单例
单例模式:步骤:1.定义静态私有对象2.构造函数私有化3.定义一个静态的,返回值为该类型的方法,一般以Getinstance/getInit为方法名称单例模式有懒汉和饿汉,最好使用饿汉1.饿汉式先实例化publicclassSingleton{privatestati
Wesley13 Wesley13
3年前
Java8——方法引用
方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式。那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用。一、方法引用的三种语法格式1\.对象::实例方法名lamdba写法:@Testvoidtest1(){