🏷 Functional Programming
5 patterns
Topic: Functional Programming
All Java patterns related to Functional Programming — java.evolved
Language
Anonymous classes to lambdas and method references
Old
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
save(event);
}
});
Modern
button.addActionListener(this::save);
hover to see modern →
JDK 8+
learn more →
Collections
Atomic map updates with compute and merge
Old
List<String> values = groups.get(key);
if (values == null) {
values = new ArrayList<>();
groups.put(key, values);
}
values.add(value);
Modern
groups.computeIfAbsent(key, ignored -> new ArrayList<>())
.add(value);
hover to see modern →
JDK 8+
learn more →
Collections
Collection bulk operations instead of mutation loops
Old
for (Iterator<Order> it = orders.iterator(); it.hasNext();) {
if (it.next().cancelled()) {
it.remove();
}
}
Modern
orders.removeIf(Order::cancelled);
hover to see modern →
JDK 8+
learn more →
Collections
Comparator factories and fluent ordering
Old
people.sort(new Comparator<Person>() {
@Override
public int compare(Person a, Person b) {
int byName = a.name().compareTo(b.name());
return byName != 0 ? byName : Integer.compare(a.age(), b.age());
}
});
Modern
people.sort(Comparator.comparing(Person::name)
.thenComparingInt(Person::age));
hover to see modern →
JDK 8+
learn more →
Streams
Predicate.not() for negation
Old
List<String> nonEmpty = list.stream()
.filter(s -> !s.isBlank())
.collect(Collectors.toList());
Modern
List<String> nonEmpty = list.stream()
.filter(Predicate.not(String::isBlank))
.collect(Collectors.toList());
hover to see modern →
JDK 11+
learn more →