Java 8: Working with Supplier


A quick practical guide to working with Supplier Functional Interface. It just supplies something always and does not take any input. Explained with examples in Java 8.

1. Overview

In this tutorial, We'll learn about java 8 Supplier Functional Interface.

Supplier is part of package java.util.function. This is introduced in Java 8 as part of Function programming.

Api Reference

Supplier Functional Interface has only one Abstract method.

T get()

Where T -  the type of results supplied by this supplier

Java 8 - Working with Supplier

This method is called as Functional Method.

Supplier does not take any argument but returns a value always. Because of this named as Supplier as supplies everytime something when we call get() method.

Suppliers are very useful when we do not need to supply any value but need to return a value at the same time.

2. Example to generate random number using Supplier

Now, We will see how to use Supplier to get the randome number using Math class.

Math class a static method random() that returns a random value between 0.0 and 1.0.

In previous article, We have discussed Lambda Expressions. We must have an idea about Lambda to work with Functional Interface.

Supplier randomSupplier = () -> Math.random();

Just take a look at the above functional code that Supplier returns Double value.

How to know the type of the value.

This is very simple to find. Just see what type is retuned by lambda exp, that value we shuould mention as part of the Supplier declaration.

Next, We should call the get() method. 

System.out.println("Random value 1 "+randomSupplier.get());

Once get() method is invoked then immediately lambda will be executed automatically and excutes Math.random() method which returns a random value.

See the below output.


Random value 1 0.9235006477846478

Note: get() method can be called multiple times on supplier.

The below code is completely valid.

System.out.println("Random value 2 "+randomSupplier.get());
System.out.println("Random value 3 "+randomSupplier.get());
System.out.println("Random value 4 "+randomSupplier.get());
System.out.println("Random value 5 "+randomSupplier.get());

Produces the below output.

Random value 2 0.26474106955613286
Random value 3 0.2613837445870235
Random value 4 0.41373430220646323
Random value 5 0.4281632448845335

3. Supplier Example to fix "stream has already been operated upon or closed"

Observe the below code that works fine.

List fruits = Arrays.asList("Mango", "Jack Fruit", "Water Melon", "Apple");
Stream stream = fruits.stream();

Optional anyFruitName = stream.findAny();



But, If we perform any operation stream again then we will get runtime exception.

Optional firstFruitName = stream.findFirst();


java.lang.IllegalStateException: stream has already been operated upon or closed
 at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229)
 at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:543)
 at com.java.w3schools.blog.java8.functional.SupplierStreamFix.main(SupplierStreamFix.java:17)

Here, the problem is performing the operations on stream which is already closed.

To fix this issue, we need to recreate a new Stream object.

See the complete article on "java.lang.IllegalStateException: stream has already been operated upon or closed"

This problem can be solved using Supplier as below instead of repeating the code twice to create the Stream object from fruits list.

Supplier> streamSupplier = () -> fruits.stream();

Stream anyStream = streamSupplier.get();
System.out.println("anyStream " + anyStream.findAny().get());

Stream firstStream = streamSupplier.get();
System.out.println("firstStream : " + firstStream.findAny().get());

4. Method Reference

Suppliers can be used with Method Reference.

//Mehtod Reference

Supplier methodRef = String::new;

Here, It calls the no-arg constructor.

If we want to call the argument constructor then there is a limitation for Supplier.

Note: That's just a limitation of the method reference syntax that you can't pass in any of the arguments. It's just how the syntax works.

5. Conclusion

In this article, We've studied about Supplier Functional Intetface added to java 8. Supplier has only one get() abstract method and should be used with Lambda for best practicies.

Seen the example program to get the random number and fix to a common error working with streams "java.lang.IllegalStateException: stream has already been operated upon or closed"

And also seen a note on Method Reference.

All the code shown in this post is over GitHub.



About Us

Author: Venkatesh - I love to learn and share the technical stuff.

accumulo,1,ActiveMQ,2,Adsense,1,API,37,ArrayList,18,Arrays,24,Bean Creation,3,Bean Scopes,1,BiConsumer,1,Blogger Tips,1,Books,1,C Programming,1,Collection,8,Collections,37,Collector,1,Command Line,1,Comparator,1,Compile Errors,1,Configurations,7,Constants,1,Control Statements,8,Conversions,6,Core Java,149,Corona India,1,Create,2,CSS,1,Date,3,Date Time API,38,Dictionary,1,Difference,2,Download,1,Eclipse,3,Efficiently,1,Error,1,Errors,1,Exceptions,8,Fast,1,Files,17,Float,1,Font,1,Form,1,Freshers,1,Function,3,Functional Interface,2,Garbage Collector,1,Generics,4,Git,9,Grant,1,Grep,1,HashMap,2,HomeBrew,2,HTML,2,HttpClient,2,Immutable,1,Installation,1,Interview Questions,6,Iterate,2,Jackson API,3,Java,32,Java 10,1,Java 11,6,Java 12,5,Java 13,2,Java 14,2,Java 8,128,Java 8 Difference,2,Java 8 Stream Conversions,4,java 8 Stream Examples,12,Java 9,1,Java Conversions,14,Java Design Patterns,1,Java Files,1,Java Program,3,Java Programs,114,Java Spark,1,java.lang,4,java.util. function,1,JavaScript,1,jQuery,1,Kotlin,11,Kotlin Conversions,6,Kotlin Programs,10,Lambda,2,lang,29,Leap Year,1,live updates,1,LocalDate,1,Logging,1,Mac OS,3,Math,1,Matrix,6,Maven,1,Method References,1,Mockito,1,MongoDB,3,New Features,1,Operations,1,Optional,6,Oracle,5,Oracle 18C,1,Partition,1,Patterns,1,Programs,1,Property,1,Python,2,Quarkus,1,Read,1,Real Time,1,Recursion,2,Remove,2,Rest API,1,Schedules,1,Serialization,1,Servlet,2,Sort,1,Sorting Techniques,8,Spring,2,Spring Boot,23,Spring Email,1,Spring MVC,1,Streams,31,String,61,String Programs,28,String Revese,1,StringBuilder,1,Swing,1,System,1,Tags,1,Threads,11,Tomcat,1,Tomcat 8,1,Troubleshoot,26,Unix,3,Updates,3,util,5,While Loop,1,
JavaProgramTo.com: Java 8: Working with Supplier
Java 8: Working with Supplier
A quick practical guide to working with Supplier Functional Interface. It just supplies something always and does not take any input. Explained with examples in Java 8.
Loaded All Posts Not found any posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All RECOMMENDED FOR YOU LABEL ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago $$1$$ minutes ago 1 hour ago $$1$$ hours ago Yesterday $$1$$ days ago $$1$$ weeks ago more than 5 weeks ago Followers Follow THIS PREMIUM CONTENT IS LOCKED STEP 1: Share to a social network STEP 2: Click the link on your social network Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy Table of Content