Co presne tam je za problem?
Reagoval som na použitie statických metód; tie neexistenciu obyčajných funkcií nevyriešia, ale
pridávajú vlastné problémy (statická metóda môže volať len statickú metódu a pracovať so statickými
atribútmi.)
Co znamená „lambdy se nepočítají“? Lambda je přece anonymní funkce.
Jediné, co byste mohl chtít navíc, je možnost reflexí zkoumat předanou funkci, to opravdu Java neumí.
Opravte ma ak sa mýlim, ale lambda sa len tvári ako anonymná funkcia. Je to len syntaktický
konštrukt, z ktorého kompiler spraví objekt. Java bohužiaľ nemá bežné funkcie, len metódy.
A tie nie sú first-class.
Čo bolo pridané v Java 8 je vohejbák. Java stále nemá obyčajné funkcie, len cez funkcionálne rozhrania
sa okľukou vytvárajú objekty a volajú potom metódy.
public class Example {
public static void main(String args[]) {
Function <Integer, Integer> inc = e -> e + 1;
doSum(5, inc);
}
public static void doSum(int value, Function <Integer, Integer> func) {
System.out.println(func.apply(value));
}
}
Ono to vyzerá ako funkcia, ale nie je.
Je to celé komplikované. Java pridala do jazyka celý rad preddefinovaných rozhraní
kvôli uľahčeniu práce, ale faktom je, že nemáme funkcie, len objekty a ich metódy.
Každú "funkcia" potrebuje mať vlastné rozhranie napr:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
Porovnajme si to s JavaScript kódom:
function inc(val) {
return val + 1;
}
function dec(val) {
return val - 1;
}
function double(val) {
return val * 2;
}
function halve(val) {
return val / 2;
}
let pipeline = [inc, halve, dec, double];
let res = pipeline.reduce((total, fn) => {
return fn(total);
}, 9);
console.log(res);
Je to elegantný, jednoduchý, ale veľmi expresívny kód. Žiadne statické metódy, žiadne
funkcia musí byť v classe, žiadne vohejbáky ako @FunctionalInterface alebo delegáty (C#).
Jednoduchý priamočiary kód.
Váčšina moderných programovacích jazykov má obyčajné funkcie, vrátane jazykov Python, PHP, JavaScript, Rust,
Go, Ruby, C++, F#, ...
Preto som napísal, že podľa mňa to je neexistencia obyčajných funkcií najväčšia chyba v dizajne Javy.