Java方法引用详解

简介

当lambda表达式内部只调用一个方法的时候,在无需引入新的参数时,可以使用方法引用进行简化

详解各类方法引用

有以下代码,需实现将List中的所有字符串转为大写

List<String> stringList = new ArrayList<>();  
stringList.add("a");  
stringList.add("b");  
stringList.add("c");

静态方法引用

public class StringUtils {
    public static String upperCase(final String str) {  
        if (str == null) {  
            return null;  
        }  
        return str.toUpperCase();  
    }
}
List<String> upperCaseList = stringList.stream().map(StringUtils::upperCase)  
    .collect(Collectors.toList());

原lambda表达式

List<String> upperCaseList = stringList.stream().map(item -> StringUtils.upperCase(item))  
    .collect(Collectors.toList());

lambda表达式的参数作为静态方法的参数使用

特定对象实例方法引用

public class StringUtils {
    public String upperCase(final String str) {  
        if (str == null) {  
            return null;  
        }  
        return str.toUpperCase();  
    }
}
StringUtils stringUtils = new StringUtils();
List<String> upperCaseList = stringList.stream().map(stringUtils::upperCase)  
    .collect(Collectors.toList());

原lambda表达式

StringUtils stringUtils = new StringUtils();
List<String> upperCaseList = stringList.stream().map(item -> stringUtils.upperCase(item))  
    .collect(Collectors.toList());

lambda表达式的参数作为特定对象实例方法的参数使用

特定类型任意对象实例方法引用

List<String> upperCaseList = stringList.stream().map(String::toUpperCase)  
    .collect(Collectors.toList());

原lambda表达式

List<String> upperCaseList = stringList.stream().map(item -> item.toUpperCase())  
    .collect(Collectors.toList());

lambda表达式的第一个参数作为特定类型的对象使用,后续参数作为实例方法的参数使用

构造方法引用

public class UpperString {
    private String string;

    public UpperString(String string) {
        this.string = string.toUpperCase();
    }
}
List<UpperString> upperCaseList = stringList.stream().map(UpperString::new)  
    .collect(Collectors.toList());

原lambda表达式

List<UpperString> upperCaseList = stringList.stream().map(item -> new UpperString(item))  
    .collect(Collectors.toList());

lambda表达式的参数作为构造方法的参数使用