JAVA8之函数式接口返回实例

JAVA8之函数式接口返回实例

一.    概述

        上篇说到,函数式接口返回实例有两种种方式,而上篇最后的示例实际上就是第一种返回实例的方式,也是用的最多的最基础的一种方式--lambda表达式创建实例.这里就不再介绍了.着重介绍方法引用返回实例的方式.本章节可能会涉及一些后面将要讲到的知识点,此处重点是展示,后面会仔细讲解.

二.    方法引用返回实例

      1.    构造器引用

        语法:Class::new
        构造器引用一般都会需要用的Supplier这个函数式编程的工具包(java.util.function),他是一个函数式接口.在后面会详细介绍,这一章节先只是使用方便展示.先看下Supplier类:
        
@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}
        首先创建一个Person类,其中必须有无参构造,不然会报错:
package com.yczuoxin.demo;

import java.util.function.Supplier;

public class Person {

    private String name;

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

    public Person() {
    }

    public static Person create(Supplier<Person> sup){
        return sup.get();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void run(){
        System.out.println(name + " is running");
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}


        测试创建一个Person类:
package com.yczuoxin.demo;

public class LambdaTest {
    public static void main(String[] args) {
        Person p1 = Person.create(Person::new);
        p1.setName("张三");
        System.out.println(p1);
    }
}
        可见我们使用Person::new 创建了一个Supplier的实例,所以利用构造器引用创建了函数式接口的实例.

      2.    对象的方法引用(包括静态方法)

        语法:Class::method
        先介绍一下Iterable接口下新增的默认方法forEach(),在其中用到了Consumer接口,他与Supplier接口类似,在此不做讲解,在java8中支持了接口中放入默认方法,该方法的定义如下:
default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
}
        用方法引用的方法调用系统类的输出方法和Person类的run方法:
package com.yczuoxin.demo;

import java.util.Arrays;
import java.util.List;

public class LambdaTest {
    public static void main(String[] args) {
        List<Person> list = Arrays.asList(
                new Person("张三"),
                new Person("李四"), 
                new Person("王五"), 
                new Person("赵六"));
        list.forEach(System.out::println);
        list.forEach(Person::run);
    }
}
        测试结果:

        调用成功.

三.    小结

        使用lambda表达式个人觉得最大的是使得代码看起来更简便,可以少写许多代码.最明显的还是上篇最后一个例子,用函数式接口来取代了匿名内部类.少写了几行代码.

猜你喜欢

转载自blog.csdn.net/ycxzuoxin/article/details/80949402
今日推荐