import java.math.BigDecimal; import java.util.Map; import java.util.Optional; import java.util.function.BiFunction; import java.util.stream.Stream; class Test { private Map, BiFunction> spec = null; public Optional fooIn2(Map> values) { return values.entrySet().stream().map(entry -> { String pathName = entry.getKey(); return entry.getValue().flatMap(value -> spec.entrySet().stream().filter(specEntry -> pathName.equals(specEntry.getKey().getLeft())).findFirst().map(specEntry -> { Pair specEntryKey = specEntry.getKey(); Number path = specEntryKey.getRight(); BiFunction compareFunction = specEntry.getValue(); return compareFunction.apply(path, value); })); }).flatMap(option -> option.map(Stream::of).orElse(Stream.empty())).reduce(BigDecimal::add); } static class Pair { public A getLeft() { return null; } public B getRight() { return null; } } }