Java Supplier函数接口介绍及使用示例

x33g5p2x  于2022-09-23 转载在 Java  
字(4.7k)|赞(0)|评价(0)|浏览(330)

Java Supplier 是代表结果提供者的函数接口。 Supplier的函数方法是get()。可以使用 lambda 表达式或方法引用或默认构造函数来实例化 SupplierSupplier 已在 Java 8 中引入,属于 java.util.function 包。 Supplier函数接口源代码如下。

@FunctionalInterface
public interface Supplier<T> {
    T get();
}

我们可以在上面的代码中看到 Supplier 具有返回泛型类型值的 get() 方法。 get() 方法不接受任何参数,只返回泛型类型的值。我们可以如下实例化 Supplier

Supplier<String> s = () -> "Hello World!";

Java 还提供了返回特定类型值的Supplier接口。 BooleanSupplier 返回布尔数据类型,IntSupplier 返回整数数据类型,LongSupplier 返回长数据类型,DoubleSupplier 返回双精度数据类型值。我们还可以根据我们的要求创建自定义函数接口。

使用 Lambda 表达式实例化Supplier接口

我们将在此处使用 lambda 表达式实例化 Supplier。我们知道它的方法 get() 只返回值,不接受任何参数,所以我们的 lambda 表达式将有空参数部分。
SupplierWithLambda.java

package com.concretepage;
import java.util.Random;
import java.util.function.Supplier;

public class SupplierWithLambda {
  public static void main(String[] args) {
     Supplier<String> s1 = () -> "Hello World!"; 
     System.out.println(s1.get());

     Random random = new Random();
     Supplier<Integer> s2 = () -> random.nextInt(10); 
     System.out.println(s2.get());     
  }
}

输出

Hello World!
9

使用方法参考实例化Supplier接口

方法引用使用 (::) 符号调用方法。假设我们有一个类 MyUtil 和一个静态方法 getFavoriteBook(),那么我们可以使用类名来调用它。

MyUtil::getFavoriteBook

如果我们有非静态方法,那么我们可以使用类的实例调用这个方法。假设 myUtilMyUtil 类的实例,并且 getAge() 是非静态方法,那么我们使用下面给出的实例来调用它。

myUtil::getAge

我们知道 Supplier 函数接口的 get() 方法没有参数,所以我们的方法 getFavoriteBook()getAge() 不应该接受任何参数。找到例子。
SupplierWithMethodReference.java

package com.concretepage;
import java.util.Random;
import java.util.function.Supplier;

public class SupplierWithMethodReference {
  public static void main(String[] args) {
     Supplier<String> s1 = MyUtil::getFavoriteBook;
     System.out.println(s1.get());

     MyUtil myUtil = new MyUtil();      
     Supplier<Integer> s2 = myUtil::getAge;
     System.out.println(s2.get());   
     
     Random random = new Random();
     Supplier<Integer> s3 = random::nextInt;
     System.out.println(s3.get());       
  }
}

class MyUtil {
  private Integer age = 30;
  public static String getFavoriteBook(){
      return "Mahabharat";
  }
  public Integer getAge(){
      return age;
  }
}

输出

Mahabharat
30
-682408931

使用默认构造函数实例化Supplier接口

我们可以使用不带参数的构造函数(即默认构造函数)来实例化 Supplier。查找 Book 类的构造函数参考。

Book::new

查找示例示例以使用默认构造函数实例化 Supplier
SupplierWithConstructorRef.java

package com.concretepage;
import java.util.Random;
import java.util.function.Supplier;

public class SupplierWithConstructorRef {
  public static void main(String[] args) {
     Supplier<Random> s1 = Random::new; 
     Random random = s1.get();
     System.out.println(random.nextInt(10));   
     
     Supplier<Book> s2 = Book::new; 
     Book book = s2.get();
     System.out.println(book.getBookName());
  }
}

class Book {
  private String bookName = "Mahabharat";
  public String getBookName(){
      return bookName;
  }
}

输出

9
Mahabharat

自定义Supplier接口函数界面

我们可以使用 @FunctionalInterface 注释创建自定义Supplier接口函数接口。我们的Supplier接口我们不接受任何参数,而是返回一个泛型类型的值。
CustomSupplierDemo.java

package com.concretepage;
import java.util.Random;

@FunctionalInterface
interface MySupplier<T> {
    T fetch();
}

public class CustomSupplierDemo {
  public static void main(String[] args) {
     //Using Lambda Expression
     MySupplier<String> s1 = () -> "Hello World!"; 
     System.out.println(s1.fetch());

     //Using Method Reference
     Random random = new Random();
     MySupplier<Integer> s2 = random::nextInt;
     System.out.println(s2.fetch());       
     
     //Using Constructor
     MySupplier<Random> s3 = Random::new; 
     Random rdm = s3.fetch();
     System.out.println(rdm.nextInt(10));      
  }
}

输出

Hello World!
521143516
6

BooleanSupplier、IntSupplier、LongSupplier、DoubleSupplier

Java 提供了以下用于特定数据类型Supplier接口的函数接口。
BooleanSupplier:Supplier接口返回布尔值。它的方法是getAsBoolean()
IntSupplier:Supplier接口返回整数数据类型值。它的方法是getAsInt()
LongSupplier:Supplier接口返回长数据类型值。它的方法是getAsLong()
DoubleSupplier:Supplier接口返回双精度数据类型值。它的方法是getAsDouble()

查找示例示例。
SpecificDataTypeSupplier.java

package com.concretepage;
import java.util.Random;
import java.util.function.BooleanSupplier;
import java.util.function.DoubleSupplier;
import java.util.function.IntSupplier;
import java.util.function.LongSupplier;

public class SpecificDataTypeSupplier {
  public static void main(String[] args) {
    int age = 30;
    BooleanSupplier bs = () -> age > 20;
    System.out.println(bs.getAsBoolean());
    
    Random random = new Random();
    IntSupplier is = random::nextInt;
    System.out.println(is.getAsInt());
    
    LongSupplier ls = random::nextLong;
    System.out.println(ls.getAsLong());    

    DoubleSupplier ds = random::nextDouble;
    System.out.println(ds.getAsDouble());    
  }
}

输出

true
-429015737
5525406112169000010
0.7553680537299522

Java Supplier接口与消费者

Java SupplierConsumer 都是函数式接口。 Supplier 表示返回对象且不接受参数的结果提供者,而 Consumer 表示接受单个输入参数且不返回结果的操作。找到Supplier函数接口的方法。

T get()

找到Consumer函数接口的方法。

void accept(T t)

现在找到示例示例。
SupplierConsumerDemo.java

package com.concretepage;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class SupplierConsumerDemo {
  public static void main(String[] args) {
    Supplier<String> s = Country::getPMName;
    Consumer<String> c = Country::printMessage;   
    c.accept(s.get());
  }
}

class Country {
  public static String getPMName() {
	return "Narendra Modi";
  }
  public static void printMessage(String msg) {
	System.out.println(msg);
  }
}

输出

Narendra Modi

相关文章