java.util.function.supplier 接口
supplier 是java8中java.util.function包中定义的一个功能接口。它返回结果的供应商。它有一个抽象的方法get() 。这个接口被用作lambda表达式和方法引用/构造器引用的赋值目标。
以下是一个供应商接口声明
@FunctionalInterface
public interface Supplier{
T get();
}
T是由这个方法产生的结果。
简单的Supplier获取示例
这是一个使用供应商打印消息的例子。使用Supplier 接口创建了一个对象,并调用get() 方法。
import java.util.function.Supplier;
public class MySupplierExample {
public static void main(String[] args) {
Supplier stringSupplier = () -> new String("Hi Frank");
String strMsg = stringSupplier.get();
System.out.println(strMsg);
}
}
并输出:
Hi Frank
供应商对象 创建一个类
supplier 是用来创建一个类的对象的。
类名和new关键字将创建一个供应商。供应商get方法返回一个类的对象。
import java.util.function.Supplier;
public class MySupplierExample {
public static void main(String[] args) {
Supplier messageSupplier = Message::new;
Message message = messageSupplier.get();
System.out.println(message.getMsg("John"));
}
}
class Message {
public String getMsg(String name) {
return name;
}
}
上述代码的输出是
John
供应商静态方法调用示例
另一种方法,使用类名直接静态方法创建一个Supplier对象类型。
supplier.get() 将被直接调用静态。
import java.util.function.Supplier;
public class MySupplierExample {
public static void main(String[] args) {
Supplier strSupplier = Message::getStaticMsg;
System.out.println(strSupplier.get());
}
}
class Message {
public static String getStaticMsg() {
return "Static Message";
}
}
上述代码的输出是
Static Message
将Supplier作为参数传递给Stream API方法的例子
这里supplier ,作为参数传递给stream方法。Stream map() method ,接受supplier Functional接口作为一个参数。
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class MySupplierExample {
public static void main(String[] args) {
List users= new ArrayList<>();
users.add(new User(1,"Kiran"));
users.add(new User(2,"Frank"));
users.add(new User(3,"John"));
users.add(new User(4,"Tom"));
Stream names = users.stream().map(User::getName);
names.forEach(name -> System.out.println(name));
}
}
public class User {
Integer id;
String name;
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
上述代码的输出结果是
Kiran
Frank
John
Tom
供应商构造器参数示例
通过传递参数创建用户对象,并返回Supplier 对象。调用get()方法返回该对象
import java.util.function.Supplier;
public class MySupplierExample {
public static void main(String[] args) {
Supplier userSupplier= () -> new User(1,"hello");
User user=userSupplier.get();
System.out.println(user.getName());
}
}
输出:
Ram
如何生成一个无限的自然数序列
如果你想生成无限的自然数递增顺序,你可以使用下面的函数
import java.util.function.IntSupplier;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
IntSupplier naturalGenerator = new IntSupplier() {
int currentValue = 0;
public int getAsInt() {
return currentValue++;
}
};
IntStream naturalStream = IntStream.generate(naturalGenerator);
}
}
原始的供应商接口
对于原始类型有不同的Supplier接口。
以下所有的接口都有一个抽象方法。所有这些接口都定义在java.util.function 包中:
- IntSupplier - 有getAsInt()方法
- LongSupplier--有getAsLong()方法
- DoubleSupplier--有getAsDouble()方法
- BooleanSupplier--有getAsBoolean()方法。
总结
在本教程中,我们学习了Supplier功能接口,以及使用该类的各种例子