关于java:Java-常用函数式接口-Supplier接口

34次阅读

共计 1667 个字符,预计需要花费 5 分钟才能阅读完成。

JDK 提供了大量的函数式接口,不便咱们开发的时候无需本人编写接口,这些接口都比拟通用,学会他们并且在工作中应用,不仅不便的解决问题,而且非常优雅。

1、接口概述

Supplier 接口的源码比较简单,只有一个办法。

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();}

get 办法没有参数,然而有一个返回值,该返回值是泛型参数指定的类型。该办法用于创立指定类型的对象。

2、应用形式

在尝试应用 Supplier 接口之前,咱们先看这样的一个场景: 尝试从某个中央获取一个对象,如果没有获取到,那么咱们就本人造一个

咱们先定义一个对象 Person.

public class Person {
    private final String name;
    private final Integer age;

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

当初来测试:

public class SupplierTest {private static List<Person> personList = new ArrayList<Person>() {
        {add(new Person("lisi", 20));
            add(new Person("zhangsan", 23));
        }
    };

    public static void main(String[] args) {
        String name = "wangwu";
        Person person = getPerson(name);
        if (person == null) {person = new Person(name, 10);
        }
        // 后续解决
        System.out.println(person);
    }

    public static Person getPerson(String name) {for (Person person : personList) {if (person.getName().equals(name)) {return person;}
        }
        return null;
    }
}

代码中首先应用 getPerson 来获取一个对象,而后再判断是否获取胜利,没有的话本人再造一个对象,下面的这种写法尽管能解决问题,但当初能够应用 Supplier 简化代码。

public class SupplierTest {private static List<Person> personList = new ArrayList<Person>() {
        {add(new Person("lisi", 20));
            add(new Person("zhangsan", 23));
        }
    };

    public static void main(String[] args) {
        String name = "wangwu";
        Person person = getPerson(name, () -> new Person(name, 10));
        // 后续解决
        System.out.println(person);
    }

    public static Person getPerson(String name, Supplier<Person> supplier) {return personList.stream()
                .filter(e -> e.getName().equals(name))
                .findAny()
                .orElse(supplier.get());
    }
}

这里咱们在 getPerson 办法中增加了一个参数 Supplier<Person> supplier,在没有获取到须要寻找的对象的时候,由外界提供的 Supplier 来解决。那么咱们在 main 办法中调用 getPerson 的时候就无需进行空判断,代码也就比较清楚简略。

Person person = getPerson(name, () -> new Person(name, 10));

这种模式看起来十分直观,对于这种场景应该激励应用。Supplier 是供应型接口,没有任何参数的时候产生一个对象。

正文完
 0