import java.util.function.Function;
import java.util.Map;
import java.util.HashMap;
class MapFunction<K, V> implements Function<K, V>
{
private final Map<K, V> map;
public MapFunction(Map<K, V> map) {
this.map = map==null?new HashMap<K,V>():map;
}
public static<K,V> MapFunction<K,V> forMap(Map<K,V> map){
return new MapFunction<K,V>(map);
}
@Override
public V apply(K key) {
if(!map.containsKey(key))throw new IllegalArgumentException();
return map.get(key);
}
public Function<K, V> defaultVal(V value){
return (k)->map.getOrDefault(k, value);
}
}
public class TestMapFuncWithImmutable{
public static <K,V> MapFunction<K,V> forMap(Map<K,V> map){
return new MapFunction<>(map);
}
public static void main(String [] args){
Map<String, Double> rates = new HashMap<>();
rates.put("USD", 1.0772);
rates.put("SEK", 9.379);
rates.put("BRL", 3.2328);
rates.put("AUD", 1.3937);
MapFunction<String, Double> ratesFn = forMap(rates);
Function<String, Double> f2 = ratesFn.defaultVal(999.0);
System.out.println(f2.apply("XPTO")); // => retorna o valor default
double australianRate = ratesFn.apply("AUD"); // => 1.3937
System.out.println(australianRate);
double canadianRate = ratesFn.apply("CAD"); // => Não lança IllegalArgumentException!!!
System.out.println(canadianRate);
}
}