po co odwoływać się do metod statycznych przez lambdy/method handlery? W końcu wymaga to tworzenia interfejsu funkcyjnego(...)
Nie musisz tworzyć interfejsu funkcyjnego bo Java już takowe posiada (spójrz: Function, Consumer, Supplier, Runnable, Callable itp. ) - możesz je po prostu zaimplementować. Prosta rzecz:
public String replaceValues(String argument, int mapType){
Function<String, String> mapper;
if(mapType == 1){
mapper = MyClass::firstMap;
} else {
mapper = MyClass::secondMap;
}
return mapper.apply(argument);
}
private static String firstMap(String s){
return s.replaceAll("A", "B");
}
private static String secondMap(String s){
return s.replaceAll("A", "C");
}
Oczywiście jest to przykład mocno uproszczony. Jednakże traktując metody - także statyczne - jako obiekty, które można sobie przekazywać itp. można wiele rzeczy fajnych zrobić.
Drugą opcją jest zamiana lambda statement na lambda expression, tj. kiedy metoda jest za długa żeby zapisać ją w jednej linijce to można ją uprościć na potrzeby czytelności kodu:
Np. takie coś:
public Collection<String> process(Collection<String> strings){
return strings.stream()
.map(s -> {
StringBuffer padded = new StringBuffer(s);
while (padded.length() < 5) {
padded.append("0");
}
return padded.toString();
}
).collect(Collectors.toSet());
}
wygląda gorzej niż:
public Collection<String> process2(Collection<String> strings){
return strings.stream()
.map(Test::pad)
.collect(Collectors.toSet());
}
public static String pad(String str){
StringBuffer padded = new StringBuffer(str);
while (padded.length() < 5){
padded.append("0");
}
return padded.toString();
}
Zwłaszcza, jeżeli takich mapowań w stream'ie byłoby więcej