jdk1.8 方法引用与构造器引用 数组引用

1. 方法引用: 若 Lambda 体中的内容有方法已经实现了,我们可以用 “方法引用” (可以理解为方法引用是 Lambda 表达式的另一种表现方式)

主要有三种语法格式:

  • 对象 :: 实例方法名
  • 类 :: 静态方法名
  • 类 :: 实例方法名

注:
①: Lambda 体中调用方法的参数列表与返回值类型,函数式接口中抽象方法的函数列表和返回值类型保持一致!
②: 若 Lambda 参数类表中的第一个参数(x)是 实例方法的调用着(x.equals(y)),而第二个参数是实例方法的参数时,可以使用 ClassName::method


这是所有导包

import lambda.Person;
import org.junit.Test;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.*;

对象::实例方法名

@Test
public void test1(){
    //消费型接口(有参数无返回)
    Consumer<String> con = x -> System.out.println(x);   //实例方法
    PrintStream ps = System.out;
    Consumer<String> con1 = ps::println;   //返回值相同  void
    con1.accept("对象::实例方法名");
    Consumer<String> con2 = System.out::println;   //返回值相同  void
    con1.accept("对象::实例方法名111111");
}

结果:

对象::实例方法名
对象::实例方法名111111

@Test
public void test2(){
  Person ps = new Person();
  //供给型接口  (没有参数,有返回值)
    Supplier<String> supplier = () -> ps.getName();
    String str = supplier.get();
    System.out.println(str);

    Supplier<Integer> supplier1 = ps::getAge;
    Integer integer = supplier1.get();
    System.out.println(integer);
}

结果:

null
0

类::静态方法名

@Test
public void test3(){
    Comparator<Integer> comparator = (x,y) -> Integer.compare(x,y);
    comparator.compare(1,2);
    Comparator<Integer> comparator1 = Integer::compare;
    comparator1.compare(1,2);
}

类::实例方法名

@Test
public void test4(){
    BiPredicate<String,String> bp  = (x,y) -> x.equals(y);
    boolean test = bp.test("1", "2");
    System.out.println(test);
    
    BiPredicate<String,String> bp1  = String::equals;
    boolean test1 = bp1.test("2","2");
    System.out.println(test1);
}

结果:

false
true

二, 构造器引用:

  • 格式:
    ClassName::new
  • 注意:
    需要调用的构造器参数列表要与函数式接口中的抽象方法的参数列表保持一致

构造器引用 无参

@Test
public void test5(){
    Supplier<Person> sup = () -> new Person();
    Person person1 = sup.get();
    System.out.println(person1);

    Supplier<Person> sup1 = Person::new;
    Person person = sup1.get();
    System.out.println(person);
}

结果:

Person{id=0, name='null', age=0, salary=0.0}
Person{id=0, name='null', age=0, salary=0.0}

构造器引用 有参:

创建类Person:

@Getter
@Setter
@ToSting
public class Person {
	private int id;
    private String name;
    private int age;
    private double salary;

    public Person(){
    }

    public Person(int id) {
        this.id = id;
    }

    public Person(int id, int age) {
        this.id = id;
        this.age = age;
    }
}

注解无法使用手动添加get,set,toString方法

编写测试:

    @Test
    public void test6(){
        Function<Integer,Person> fun = (x) -> new Person(x);
        Function<Integer,Person> fun1 = Person::new;
        Person apply = fun1.apply(1);
        System.out.println(apply);

        BiFunction<Integer,Integer,Person> biFunction = Person::new;
        Person apply1 = biFunction.apply(1, 2);
        System.out.println(apply1);
    }

结果:

Person{id=1, name='null', age=0, salary=0.0}
Person{id=1, name='null', age=2, salary=0.0}

调用方法时,将会自动匹配参数类型参数个数


三, 数组引用:

Type::new

    @Test
    public void test7(){
        Function<Integer,String[]> fun = x -> new String[x];
        String[] strs = fun.apply(10);
        System.out.println(strs.length);

        Function<Integer,Integer[]> function = Integer[]::new;
        Integer[] ints = function.apply(9);
        System.out.println(ints.length);
    }

结果:

10
9
  • 不完善,自己都还没太懂,后续会补上
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
方法引用是 JDK 1.8 中的一个新特性,它允许我们通过方法的名称来引用已经存在的方法,从而替代 Lambda 表达式。方法引用的语法格式为: ``` object :: methodName ``` 其中,`object` 可以是类名、对象名或者是一个表达式,`methodName` 则是一个方法名。 方法引用可以分为 4 种类型: 1. 静态方法引用引用静态方法。 ``` 类名::methodName ``` 2. 实例方法引用引用某个对象的实例方法。 ``` 对象名::methodName ``` 3. 特定类的任意对象的实例方法引用引用特定类的任意对象的实例方法。 ``` 类名::methodName ``` 4. 构造方法引用引用构造方法。 ``` 类名::new ``` 下面是一些示例: 1. 静态方法引用: ```java // Lambda 表达式 Function<String, Integer> toInteger = s -> Integer.parseInt(s); // 方法引用 Function<String, Integer> toInteger = Integer::parseInt; ``` 2. 实例方法引用: ```java // Lambda 表达式 BiPredicate<List<Integer>, Integer> contains = (list, element) -> list.contains(element); // 方法引用 BiPredicate<List<Integer>, Integer> contains = List::contains; ``` 3. 特定类的任意对象的实例方法引用: ```java // Lambda 表达式 BiFunction<String, String, Boolean> startsWith = (s1, s2) -> s1.startsWith(s2); // 方法引用 BiFunction<String, String, Boolean> startsWith = String::startsWith; ``` 4. 构造方法引用: ```java // Lambda 表达式 Supplier<List<String>> listSupplier = () -> new ArrayList<>(); // 方法引用 Supplier<List<String>> listSupplier = ArrayList::new; ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值