jdk8特性之方法引用

方法引用:当在使用lambda表达式书写时,如果只是调用一个方法,就可以用方法应用代替,可以使代码更加简洁

package com.core;

import lombok.Builder;
import lombok.Data;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class JDK8Test {

    @Test
    public void methodReferenceTest(){
        List<Student> list = new ArrayList<>();
        list.add(new Student.StudentBuilder().name("张三").build());
        list.add(new Student.StudentBuilder().name("李四").build());
        list.add(new Student.StudentBuilder().name("王五").build());
        list.forEach((s)->System.out.println(s));
        list.forEach(System.out::println);
    }
    
}
@Data
@Builder
class Student{
    private String name;

    public Student(String name) {
        this.name = name;
    }
}

这2行代码是等价的,因为在lamda体中只是调用了一个方法,所以可以改写成方法引用。
list.forEach((s)->System.out.println(s));
list.forEach(System.out::println);
使用方法引用参数和返回值,必须和原lamda体中保持一致。

方法引用

方法引用包括,

  1. 特定类的任意对象的方法引用
  2. 静态方法引用
  3. 构造器方法引用
  4. 特定实例方法应用
package com.core;

import lombok.Builder;
import lombok.Data;
import org.junit.Before;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;

public class JDK8Test {

   List<Student> list = null;

   @Before
   public void before(){
       list = new ArrayList<>();
       list.add(new Student.StudentBuilder().name("张三").build());
       list.add(new Student.StudentBuilder().name("李四").build());
       list.add(new Student.StudentBuilder().name("王五").build());
   }

   @Test
   public void methodReferenceTest(){
       list.forEach((s)->System.out.println(s));
       list.forEach(System.out::println);
   }

   @Test
   public void methodReference2Test(){
       //特定类任意方法调用
       list.forEach(Student::method1);


       //静态类方法引用
       Consumer<String> consumer = (s) -> Student.method2(s);
       consumer.accept("张三");

       Consumer<String> consumer2 = Student::method2;
       consumer.accept("李四");


       //构造器方法应用,参数需保持一致,无论有参,无参
       Function<String,Student> function = (name)-> new Student(name);
       Function<String,Student> function1 = Student::new;

       //特定实例方法引用
       Student student = new Student("王五");
       Consumer<String> consumer3 = student::setName;
       consumer3.accept("麻六");
       System.out.println(student);
   }



}
@Data
@Builder
class Student{
   private String name;

   public Student() {
   }

   public Student(String name) {
       this.name = name;
   }
   public void method1(){
       System.out.println(this.name+":的特定类任意方法调用");
   }

   public  static void method2(String name){
       System.out.println(name +"的静态类方法调用");
   }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值