Java 8 supplier接口实例 | Java中的功能接口教程

875 阅读2分钟

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功能接口,以及使用该类的各种例子