Java 8 Function Examples
In Java 8, Function is a functional interface; it takes an argument (object of type T) and returns an object (object of type R). The argument and output can be a different type.
Function.java
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
- T – Type of the input to the function.
- R – Type of the result of the function.
Further Reading
Java 8 BiFunction Examples
Java 8 BiFunction Examples
1. Function<T, R>
1.1 This example takes a <T> String
and returns the length of the string as <R> Integer
.
Java8Function1.java
package com.mkyong;
import java.util.function.Function;
public class JavaMoney {
public static void main(String[] args) {
Function<String, Integer> func = x -> x.length();
Integer apply = func.apply("mkyong"); // 6
System.out.println(apply);
}
}
Output
6
2. Chain Function<T, R>
2.1 This example chains the Function
with andThen()
.
Java8Function2.java
package com.mkyong;
import java.util.function.Function;
public class Java8Function2 {
public static void main(String[] args) {
Function<String, Integer> func = x -> x.length();
Function<Integer, Integer> func2 = x -> x * 2;
Integer result = func.andThen(func2).apply("mkyong"); // 12
System.out.println(result);
}
}
Output
12
3. List -> Map
3.1 This example accepts Function
as an argument, convert a List
into a Map
.
Java8Function3.java
package com.mkyong;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
public class Java8Function3 {
public static void main(String[] args) {
Java8Function3 obj = new Java8Function3();
List<String> list = Arrays.asList("node", "c++", "java", "javascript");
// lambda
Map<String, Integer> map = obj.convertListToMap(list, x -> x.length());
System.out.println(map); // {node=4, c++=3, java=4, javascript=10}
// method reference
Map<String, Integer> map2 = obj.convertListToMap(list, obj::getLength);
System.out.println(map2);
}
public <T, R> Map<T, R> convertListToMap(List<T> list, Function<T, R> func) {
Map<T, R> result = new HashMap<>();
for (T t : list) {
result.put(t, func.apply(t));
}
return result;
}
public Integer getLength(String str) {
return str.length();
}
}
Output
{node=4, c++=3, java=4, javascript=10}
{node=4, c++=3, java=4, javascript=10}
4. List -> List
4.1 This example accepts Function
as an argument, convert a List
of String into another List
of String, which was hashed with SHA256.
Java8Function4
package com.mkyong;
import org.apache.commons.codec.digest.DigestUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
public class Java8Function4 {
public static void main(String[] args) {
Java8Function4 obj = new Java8Function4();
List<String> list = Arrays.asList("node", "c++", "java", "javascript");
// lambda
//List<String> result = obj.map(list, x -> obj.sha256(x));
// method reference
List<String> result = obj.map(list, obj::sha256);
result.forEach(System.out::println);
}
public <T, R> List<R> map(List<T> list, Function<T, R> func) {
List<R> result = new ArrayList<>();
for (T t : list) {
result.add(func.apply(t));
}
return result;
}
// sha256 a string
public String sha256(String str) {
return DigestUtils.sha256Hex(str);
}
}
Output
545ea538461003efdc8c81c244531b003f6f26cfccf6c0073b3239fdedf49446
cedb1bac7efcd7db47e9f2f2250a7c832aba83b410dd85766e2aea6ec9321e51
38a0963a6364b09ad867aa9a66c6d009673c21e182015461da236ec361877f77
eda71746c01c3f465ffd02b6da15a6518e6fbc8f06f1ac525be193be5507069d
P.S The DigestUtils.sha256Hex
is from the commons-codec
.
pom.xml
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>
When i try the andThen method that you have given in your example, I get the below error. Kindly help me understand what is the issue here. The Function example is clear, however the Chain Function example gives me the below error.
“The method andThen(Function) is undefined for the type Function”
check if you import “java.util.function.Function”
Can show your code?
Map<T, R> result = new HashMap<>();
list.foreach(item -> result.put(item, func.apply(item)));