【Java 8 新特性】Java Supplier示例

news/2024/7/5 23:31:56 标签: 开发语言, java

Java Supplier是一个功能接口,代表结果的提供者。

Supplier的功能方法是get()

一个Supplier可以通过lambda表达式、方法引用或默认构造函数来实例化。

SupplierJava 8中被引入,属于java.util.function包。

Supplier功能接口的源代码如下。

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

我们可以看到在上面的代码中,Supplierget()方法,可以返回通用类型的值。

get()方法不接受任何参数,只返回通用类型的值。

我们可以按以下方式实例化Supplier

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

Java还提供了返回特定类型值的Supplier

BooleanSupplier返回Boolean数据类型,IntSupplier返回Integer数据类型,LongSupplier返回Long数据类型,DoubleSupplier返回Double数据类型值。

我们还可以根据我们的要求创建自定义的功能接口。

使用Lambda表达式实例化Supplier

我们将在这里使用lambda表达式来实例化Supplier

因为我们知道它的方法get()只返回值,不接受任何参数,所以我们的lambda表达式将有空的参数部分。

SupplierWithLambda.java

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

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

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


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返回Boolean数据类型。它的方法是getAsBoolean()

IntSupplier: Supplier返回Integer数据类型。它的方法是getAsInt()

LongSupplier: Supplier返回Long数据类型。它的方法是getAsLong()

DoubleSupplier: Supplier返回Double数据类型。它的方法是getAsDouble()

下面是代码示例

SpecificDataTypeSupplier.java

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与Consumer区别

Java SupplierConsumer都是功能接口。

Supplier表示结果的提供者,该结果返回一个对象且不接受任何参数,而Consumer表示一个操作,其接受单个输入参数且不返回任何结果。

Supplier功能接口的方法。

T get() 

Consumer功能界面的方法。

void accept(T t) 

示例

SupplierConsumerDemo.java

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 

参考文献

【1】Interface Supplier
【2】Java Functional Interface
【2】Java Supplier Example


http://www.niftyadmin.cn/n/5135601.html

相关文章

shopee收货方式有哪些

Shopee 是一家电子商务平台&#xff0c;提供多种不同的收货方式&#xff0c;具体的选项可能会根据您所在的地理位置和商品的类型而有所不同。以下是一些常见的 Shopee 收货方式&#xff1a; 1、快递配送&#xff1a;这是最常见的收货方式&#xff0c;您可以选择让商家使用物流…

Linux|安装Nomachine

参考&#xff1a;2022 Nomachine 最简安装与使用指南&#xff08;https://blog.csdn.net/qq_51116518/article/details/127450253&#xff09; 解压 先将目录调整到压缩包所在目录&#xff0c;输入sudo tar zxvf nomachine_7.6.2_3_aarch64.tar.gz 添加权限 sudo chmod -R…

【【有符号数乘有符号数乘法器 verilog+ testbench 代码】】

有符号数乘有符号数乘法器 verilog testbench 代码 ssmultiplier.v module ssmultiplier #(parameter NUMBER1 8 ,parameter NUMBER2 8 )(input signed [NUMBER1-1 : 0] input1 ,input signed [NUMBER2-1 …

一站式解决安全问题

端玛科技致力于攻克困难的应用软件安全问题&#xff0c;我们的解决方案以安全标准、安全教育和安全风险评估三大支柱为安全SDLC的基础&#xff0c;这三大支柱相互依存&#xff0c;创建了一个可重复的、安全的软件开发生态系统。 主要业务范围&#xff1a;关注整个软件开发过程…

随机变量的最大最小值独立性问题

作本篇的原因是下面这道题&#xff08;出自2023李林6第二套&#xff09; 解答&#xff1a; 而引发了对于随机变量的max和min值变量来说&#xff0c;二者是否独立的问题。推理如下&#xff1a; 考虑两个独立的随机变量 X , Y X, Y X,Y&#xff0c;变量 m , M m,M m,M为其最小…

乌兹别克斯坦公司如何注册 乌兹别克斯坦公司年审 乌兹别克斯坦公司注册流程

注册乌兹别克斯坦公司优势&#xff1a; 1、政 府进行了一系列经济和商业改 革&#xff0c;以推动国内外投资。努力提高商业环境的透明度和效率。 2、 乌兹别克斯坦是“一 带 一路”倡议的重要一环&#xff0c;这为公司在区域范围内的贸易和合作提供了机遇。 3、工业和农业方…

Mybatis-Plus通用枚举功能 [MyBatis-Plus系列] - 第493篇

历史文章&#xff08;文章累计490&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 S…

移植wpa_supplicant及简单使用

嵌入式环境下的设备有时会需要能连接到外网进行一些数据的交互&#xff0c;通过利用wpa_supplicant客户端结合有线网卡或无线网卡&#xff0c;即可配置好网络达到目的。 资源&#xff1a;openssl-0.9.8e.tar.gz wpa_supplicant-0.7.3.tar.gz 源代码下载路径一&#xff1a;http…