Lambda表达式2(构造方法引用||实例方法引用)

Lambda表达式的高级用法

一、构造方法引用

注意:构造器的参数列表,需要与函数式接口中参数列表保持一致!

使用格式:类名 :: new

public class User {

    private String name;
    private Integer age;

    public User() {
        super();
    }

    public User(String name) {
        super();
        this.name = name;
    }

    public User(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }

}

1、用Lambda表达式实现分别通过User的无参构造器和一个有参构造器获得User对象

@Test
    public void test5(){
        Supplier<User> supplier =
                () -> {return new User();}; //() -> new User();如果Lambda体中只有一条语句,可以省略return
        User user1 = supplier.get();    
        System.out.println("user1 : " + user1);

        System.out.println("-----------------------------------");

        Function<String, User> function =
                (x) -> {
                    User user = new User(x);
                    return user;
                };
        User user = function.apply("lzj");
        System.out.println("user : " + user);

    }

2、Lambda的构造器引用分别实现通过User的无参构造器和一个有参构造器获得User对象

@Test
    public void test6(){
        Supplier<User> supplier = User::new;
        /*get方法无参,有返回值,所以调用的User的无参构造器,返回User对象*/
        User user1 = supplier.get();
        System.out.println("user1 : " + user1);

        System.out.println("-----------------------------------");

        Function<String, User> function = User::new;
        /*apply方法有一个参数,有返回值,所以调用User的一个参数的构造器,并返回User对象*/
        User user = function.apply("lzj");
        System.out.println("user : " + user);
    }

两种方式输出结果相同:

user1 : User [name=null, age=null]
-----------------------------------
user : User [name=lzj, age=null]

2、静态方法引用

使用格式:类名 :: 静态方法名

例如我们要用Comparator接口的compare方法实现比较两个整数值的大小 1、用Lambda表达式表示如下

@Test
    public void test3(){
        Comparator<Integer> comparator = 
                (x, y) -> {
                    Integer differ = x < y ? -1 : ((x == y) ? 0 : 1);
                    return differ;
                };
        Integer differ1 = comparator.compare(10, 5);
        System.out.println("differ1 : " + differ1);
    }

3、实例方法引用

使用格式1:类名 :: 实例方法名

示例:用Lambda表达式实现比较两个字符串的大小

@Test
    public void test4(){
        BiPredicate<String, String> bp =
                (x, y) -> {
                    Boolean flag = x.equals(y);
                    return flag;
                };
        Boolean flag = bp.test("pp", "pp");
        System.out.println("flag : " + flag);
    }

使用格式2:对象的引用 :: 实例方法名

用Lambda表达式实现打印字符串

@Test
    public void test1(){
        Consumer<String> consumer = (x) -> System.out.println(x);
        consumer.accept("ppya");
    }

4.Lambda的数组引用

@Test
    public void test7(){
        Function<Integer, String[]> function =
                (x) -> new String[x]; //省略retuen的写法
        String[] ss = function.apply(5);
        System.out.println("ss.length : " + ss.length);

        Function<Integer, String[]> function1 = String[]::new;
        String[] sss = function1.apply(5);
        System.out.println("sss.length : " + sss.length);

    }
经验分享 程序员 微信小程序 职场和发展