Java8之方法引用

方法引用的形式
方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号)


有以下四种形式的方法引用:

类型 示例
引用静态方法 ContainingClass::staticMethodName
引用某个对象的实例方法containingObject::instanceMethodName
引用某个类型的任意对象的实例方法ContainingType::methodName
引用构造方法ClassName::new

下面我们通过一个小Demo来分别学习这几种形式的方法引用:

public class Person {
    public enum Sex{
        MALE,FEMALE
    }

    String name;
    LocalDate birthday;
    Sex gender;
    String emailAddress;

    public String getEmailAddress() {
        return emailAddress;
    }

    public Sex getGender() {
        return gender;
    }

    public LocalDate getBirthday() {
        return birthday;
    }

    public String getName() {
        return name;
    }

    public static int compareByAge(Person a,Person b){
        return a.birthday.compareTo(b.birthday);
    }

}

引用静态方法

Person [] persons = new Person[10];

//使用匿名类
Arrays.sort(persons, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.birthday.compareTo(o2.birthday);
            }
 });

//使用lambda表达式
Arrays.sort(persons, (o1, o2) -> o1.birthday.compareTo(o2.birthday));

//使用lambda表达式和类的静态方法
Arrays.sort(persons, (o1, o2) -> Person.compareByAge(o1,o2));

//使用方法引用
//引用的是类的静态方法
Arrays.sort(persons, Person::compareByAge);

引用对象的实例方法

class ComparisonProvider{
            public int compareByName(Person a,Person b){
                return a.getName().compareTo(b.getName());
            }

            public int compareByAge(Person a,Person b){
                return a.getBirthday().compareTo(b.getBirthday());
            }
        }

ComparisonProvider provider = new ComparisonProvider();

//使用lambda表达式
//对象的实例方法
Arrays.sort(persons,(a,b)->provider.compareByAge(a,b));

//使用方法引用
//引用的是对象的实例方法
Arrays.sort(persons, provider::compareByAge);
引用类型对象的实例方法

String[] stringsArray = {"Hello","World"};

//使用lambda表达式和类型对象的实例方法
Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));

//使用方法引用
//引用的是类型对象的实例方法
Arrays.sort(stringsArray, String::compareToIgnoreCase);

引用构造方法

public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>>
    DEST transferElements(SOURCE sourceColletions, Supplier<DEST> colltionFactory) {
        DEST result = colltionFactory.get();
        for (T t : sourceColletions) {
            result.add(t);
        }
        return result;
    }
...
 
final List<Person> personList = Arrays.asList(persons);

//使用lambda表达式
Set<Person> personSet = transferElements(personList,()-> new HashSet<>());

//使用方法引用
//引用的是构造方法
Set<Person> personSet2 = transferElements(personList, HashSet::new);

### 方法引用的定义 Java 8 引入了方法引用,它是一种更简洁的 Lambda 表达式,用于直接引用已有的方法方法引用可以使代码更简洁易读,尤其在使用函数式接口时,避免了 Lambda 表达式中重复的方法调用代码。 ### 方法引用的类型 #### 静态方法引用 语法:`类名::静态方法名`。用于引用类的静态方法。 ```java import java.util.Arrays; import java.util.List; class MathUtils { static int square(int num) { return num * num; } } public class StaticMethodReferenceExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .map(MathUtils::square) .forEach(System.out::println); } } ``` 这里 `MathUtils::square` 是静态方法引用引用了 `MathUtils` 类的 `square` 静态方法。 #### 实例方法引用 语法:`实例对象::实例方法名`。用于引用某个对象实例方法。 ```java import java.util.Arrays; import java.util.List; class StringUtils { boolean isUpperCase(String str) { return str.equals(str.toUpperCase()); } } public class InstanceMethodReferenceExample { public static void main(String[] args) { StringUtils utils = new StringUtils(); List<String> words = Arrays.asList("HELLO", "world", "JAVA"); words.stream() .filter(utils::isUpperCase) .forEach(System.out::println); } } ``` `utils::isUpperCase` 是实例方法引用引用了 `utils` 对象的 `isUpperCase` 方法。 #### 特定类型的任意对象实例方法引用 语法:`类名::实例方法名`。当 Lambda 表达式的第一个参数是实例方法的调用者,并且其余参数是实例方法的参数时使用。 ```java import java.util.Arrays; import java.util.List; public class ArbitraryObjectInstanceMethodReferenceExample { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.stream() .sorted(String::compareToIgnoreCase) .forEach(System.out::println); } } ``` `String::compareToIgnoreCase` 属于这种类型的方法引用。 #### 构造方法引用 语法:`类名::new`。用于引用类的构造方法。 ```java import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; class Person { String name; Person(String name) { this.name = name; } } public class ConstructorMethodReferenceExample { public static void main(String[] args) { Supplier<List<Person>> listSupplier = ArrayList::new; List<Person> personList = listSupplier.get(); personList.add(new Person("John")); System.out.println(personList.size()); } } ``` `ArrayList::new` 是构造方法引用用于创建 `ArrayList` 对象。 ### 方法引用的使用场景 方法引用用于函数式接口的实现,如 `Predicate`、`Function`、`Consumer` 等。在使用 Java Stream API 时,方法引用可以使代码更加简洁,提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值