Functions class provides useful methods
to work with Function instances.
Using the Functions.forMap method
‘forMap’ method takes a map as input
and returns a Function instance, which performs map look up operation.
There are two overloaded versions of
forMap method available.
public static <K,V> Function<K,V> forMap(Map<K,V> map)
Takes a map as input and returns a
Function instance, which performs map look up operation. If key doesn’t exist
in map, then this function throws IllegalArgumentException.
public static <K,V> Function<K,V> forMap(Map<K,? extends
V> map, @Nullable V defaultValue)
Takes a map as input and returns a
Function instance, which performs map look up operation. If key doesn’t exist
in map, then this function returns default value.
import java.util.Objects; import com.google.common.base.MoreObjects; public class Employee { private String firstName; private String lastName; private int age; private int id; Employee() { this(-1, "no data", "no data", -1); } Employee(int id, String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } @Override public boolean equals(Object employee) { if (Objects.isNull(employee)) return false; if (!(employee instanceof Employee)) return false; Employee emp = (Employee) employee; return id == emp.id; } @Override public int hashCode() { return Objects.hash(firstName, lastName, age); } @Override public String toString() { return MoreObjects.toStringHelper(this).omitNullValues().add("id", id) .add("firstName", firstName).add("lastName", lastName) .add("age", age).toString(); } }
import java.util.HashMap; import java.util.Map; import com.google.common.base.Functions; import com.google.common.base.Function; public class FunctionsForMapEx { public static void main(String args[]) { Map<Integer, Employee> employees = new HashMap<>(); employees.put(1, new Employee(1, "Hari Krishna", "Gurram", 26)); employees.put(2, new Employee(2, "Sankalp", "Dubey", 31)); Function<Integer, Employee> emps = Functions.forMap(employees, new Employee()); System.out.println(emps.apply(1)); System.out.println(emps.apply(3)); } }
Output
Employee{id=1, firstName=Hari Krishna, lastName=Gurram, age=26} Employee{id=-1, firstName=no data, lastName=no data, age=-1}
Using Functions.compose method
Functions class provides compose
method, which returns composition of two functions.
public static <A,B,C> Function<A,C>
compose(Function<B,C> g, Function<A,? extends B> f)
Returns the composition of two
functions. For f: A->B and g: B->C, composition is defined as the
function h such that h(a) == g(f(a)) for each a.
Lets say I had one map where employee
id is mapped to manager id. I had another map where manager id is mapped to
manager details. My task is to get manager details from employee id.
empId ----->Manager Id ----->
Manager Details
import java.util.Objects; import com.google.common.base.MoreObjects; public class Manager { private String firstName; private String lastName; private int age; private int id; Manager() { this(-1, "no data", "no data", -1); } Manager(int id, String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } @Override public boolean equals(Object manager) { if (Objects.isNull(manager)) return false; if (!(manager instanceof Manager)) return false; Manager mng = (Manager) manager; return id == mng.id; } @Override public int hashCode() { return Objects.hash(firstName, lastName, age); } @Override public String toString() { return MoreObjects.toStringHelper(this).omitNullValues().add("id", id) .add("firstName", firstName).add("lastName", lastName) .add("age", age).toString(); } }
import java.util.HashMap; import java.util.Map; import com.google.common.base.Function; import com.google.common.base.Functions; public class CompositionTest { public static void main(String args[]) { Map<Integer, Manager> managers = new HashMap<>(); managers.put(1, new Manager(1, "Hari Krishna", "Gurram", 36)); managers.put(2, new Manager(2, "Sankalp", "Dubey", 41)); Function<Integer, Manager> managerDetails = Functions.forMap(managers, new Manager()); Map<Integer, Integer> empToManager = new HashMap<>(); empToManager.put(1, 1); empToManager.put(2, 1); empToManager.put(3, 1); empToManager.put(4, 1); empToManager.put(5, 2); empToManager.put(6, 2); Function<Integer, Integer> empToManagerMap = Functions.forMap( empToManager, 1); Function<Integer, Manager> details = Functions.compose(managerDetails, empToManagerMap); System.out.println("Manager for employee 1 " + details.apply(1)); System.out.println("Manager for employee 5 " + details.apply(5)); System.out.println("Manager for employee 7 " + details.apply(7)); } }
Output
Manager for employee 1 Manager{id=1, firstName=Hari Krishna, lastName=Gurram, age=36} Manager for employee 5 Manager{id=2, firstName=Sankalp, lastName=Dubey, age=41} Manager for employee 7 Manager{id=1, firstName=Hari Krishna, lastName=Gurram, age=36}
No comments:
Post a Comment