Java 8 Supplier Examples
In Java 8, Supplier is a functional interface; it takes no arguments and returns a result.
Supplier.java
@FunctionalInterface
public interface Supplier<T> {
T get();
}
1. Supplier
1.1 This example uses Supplier
to return a current date-time.
Java8Supplier1.java
package com.mkyong;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.function.Supplier;
public class Java8Supplier1 {
private static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
Supplier<LocalDateTime> s = () -> LocalDateTime.now();
LocalDateTime time = s.get();
System.out.println(time);
Supplier<String> s1 = () -> dtf.format(LocalDateTime.now());
String time2 = s1.get();
System.out.println(time2);
}
}
Output
2020-03-02T16:10:49.281223
2020-03-02 16:10:49
2. Returns a Supplier
Java8Supplier2.java
package com.mkyong;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
public class Java8Supplier2<T> {
public static void main(String[] args) {
Java8Supplier2<String> obj = new Java8Supplier2();
List<String> list = obj.supplier().get();
}
public Supplier<List<T>> supplier() {
// lambda
// return () -> new ArrayList<>();
// constructor reference
return ArrayList::new;
}
}
3. Factory
3.1 A simple factory method to return a Developer
object.
Java8Supplier3.java
package com.mkyong;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.function.Supplier;
public class Java8Supplier3 {
public static void main(String[] args) {
Developer obj = factory(Developer::new);
System.out.println(obj);
Developer obj2 = factory(() -> new Developer("mkyong"));
System.out.println(obj2);
}
public static Developer factory(Supplier<? extends Developer> s) {
Developer developer = s.get();
if (developer.getName() == null || "".equals(developer.getName())) {
developer.setName("default");
}
developer.setSalary(BigDecimal.ONE);
developer.setStart(LocalDate.of(2017, 8, 8));
return developer;
}
}
Developer.java
package com.mkyong;
import java.math.BigDecimal;
import java.time.LocalDate;
public class Developer {
String name;
BigDecimal salary;
LocalDate start;
// for factory(Developer::new);
public Developer() {
}
// for factory(() -> new Developer("mkyong"));
public Developer(String name) {
this.name = name;
}
// get, set, constructor, toString
//...
}
Output
Developer{name='default', salary=1, start=2017-08-08}
Developer{name='mkyong', salary=1, start=2017-08-08}
Developer obj = factory(Developer::new);
it shown compile time error for above line
Multiple markers at this line
– The type Developer does not define Developer() that is applicable here
– The method factory(Supplier) in the type Java8Supplier3 is not applicable for the arguments
(Developer::new)
let me know how to resolve
Sorry, I updated the code again. The Developer class need a default constructor.
// for factory(Developer::new);
public Developer() {
}
// for factory(() -> new Developer("mkyong"));
public Developer(String name) {
this.name = name;
}
On #2, it should be ‘Java8Supplier2’ instead of ‘Java8Example’
Nice examples, I found it really instructive 🙂
Thanks for your feedback, article is updated.