JDK提供了大量的函数式接口,不便咱们开发的时候无需本人编写接口,这些接口都比拟通用,学会他们并且在工作中应用,不仅不便的解决问题,而且非常优雅。
1、接口概述
Supplier接口的源码比较简单,只有一个办法。
@FunctionalInterfacepublic 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
是供应型接口,没有任何参数的时候产生一个对象。