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 ExpressionMySupplier<String> s1 = () -> "Hello World!"; System.out.println(s1.fetch());//Using Method ReferenceRandom random = new Random();MySupplier<Integer> s2 = random::nextInt;System.out.println(s2.fetch());       //Using ConstructorMySupplier<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

【Java 8 新特性】Java Supplier示例相关推荐

  1. Java 8 新特性 宋红康跟学

    Java 8 新特性 Java 8 新特性简介 思维导图 并行流与串行流 Lambda表达式 Lambda 表达式语法 语法格式一:无参,无返回值,Lambda体只需一条语句 语法格式二:Lambda ...

  2. 七、Java 14 新特性

    七.Java 14 新特性 Java 14 已如期于 2020 年 3 月 17 日正式发布,此次更新是继半年前 Java 13 这大版本发布之后的又一次常规版本更新,即便在全球疫情如此严峻形势下,依 ...

  3. Java 10新特性

    Java 10新特性 Java 10是其23年历史中最快的java版本.Java因其缓慢的增长和发展而受到批评,但Java 10刚刚破坏了这一概念.Java 10是一个具有许多未来变化的版本,其范围和 ...

  4. java自动化测试语言高级之Java 9 新特性

    java自动化测试语言高级之Java 9 新特性 文章目录 java自动化测试语言高级之Java 9 新特性 Java 9 新特性 Java 9 新特性 Java 9 发布于 2017 年 9 月 2 ...

  5. java自动化测试语言高级之Java 8 新特性

    java自动化测试语言高级之Java 8 新特性 文章目录 java自动化测试语言高级之Java 8 新特性 Java 8 新特性 Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 ...

  6. Java 8 新特性,Optional介绍 | 春松客服

    目录 缘起 Optional类 Optional对象构造方法 提取Optional对象的值 使用orElse()方法获取值 使用filter()方法过滤 示例程序 注意事项 使用场景 orElseGe ...

  7. IntelliJ IDEA 使用 Java 11新特性以及Java 8 以来的Java 11新特性介绍

    文章目录 Java 11 安装 IDEA 设置 特性1:lambda表达式中允许使用var 特性2: String新增REPEAT 方法,方便拷贝字符串 特性3: 文件读写更方便:readString ...

  8. Java 8新特性终极指南

    在Java Code Geeks上已经有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Ja ...

  9. 跟我学 Java 8 新特性之 Stream 流(六)收集

    转载自   跟我学 Java 8 新特性之 Stream 流(六)收集 我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些 ...

  10. 跟我学 Java 8 新特性之 Stream 流(二)关键知识点

    转载自   跟我学 Java 8 新特性之 Stream 流(二)关键知识点 我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉.如果你没有实践,我还是再次呼吁 ...

最新文章

  1. python启动appium服务_python下appium服务的自启动和关闭
  2. Learun FrameWork 强大工作流引擎,让OA更智能
  3. [NOI2007]货币兑换Cash(DP+动态凸包)
  4. 小师妹学JVM之:Dirty cards和PLAB
  5. c++中的IO流(流的概念和流类库的结构,标准的输入输出流)
  6. ubuntu 以太网已连接但是无法联网_连接wifi时,出现“已连接但无法访问互联网”,这样做就可以了...
  7. 职场的秘密,你知道多少?
  8. 趣图 | 著名的悖论蒙提霍尔问题到底是什么?
  9. CSS的样式合并与模块化
  10. mysql 图文安装_mysql安装图解mysql图文安装教程(详细说明)
  11. wget下载网络图片
  12. Qt_QSS 样式表属性大全
  13. 【VISIO2016箭头使用】
  14. 火狐浏览器linux最新版本下载,火狐浏览器Linux最新版下载
  15. java beanshell_jmeter进阶之Beanshell引用Java代码
  16. 告诉你怎样学Java才是硬道理(转自chinaitlab)
  17. Tarjan的缩点割点概述
  18. java.sql.BatchUpdateException: Lock wait timeout exceeded; try restarting transaction
  19. unity 打包一直停留在 detecting current sdk tools version
  20. 面试题系列:Mysql 夺命13问,你能扛到第几问?

热门文章

  1. 想要显年轻?5个习惯只要你坚持,会看到不一样
  2. win11成功安装fbprophet模块
  3. Remcos RAT流量分析报告
  4. 2022-06-05:不规则数独问题。 3*3填数独, 每一行要填1~3, 每一列要填1~3, 3*3的区域会拆分成不规则的三个集团区域, 每个集团区域3个格子, 每个集团的区域都一定是一个连在一起的
  5. STC12C5A60S2最小系统板/51单片机温度显示和温度控制风扇
  6. 「业务架构」定义业务能力-备忘单
  7. MySQL练习题目(一)
  8. 计算机高中期末总结作文,高中生期末总结作文1000字
  9. 外刊IT网站经典计算机开发,评论,总结文章汇总共享
  10. 接触网的异物入侵 和卡尔曼的异物检测系统