Konkretnie mówię tu o funkcyjnym podejściu do operacji na tablicach/hashmapach w JS. Ktoś na szczęście już dawno wpadł na ten pomysł i mamy bibliotekę Google Guava, która jest dość dobrze poważana w świecie Javy.
Klika analogii JS => Java:
array.map(...) => Iterables.transform(...)
array.filter(...) => Iterables.filter(...)
W Guavie brakuje mi tylko 1 funkcji do pełni szczęścia, tj. odpowiednika funkcji array.reduce(...). Teoretycznie jest w planach jej prowadzenie, ale póki co jej nie ma, więc można szybko stworzyć własną implementacje.
import com.google.common.base.Preconditions; public class Iterables { /** * redukuje przekazany {@link Iterable} do obiektu A * @param iterable co redukujemy * @param initialValue wartosc inicjalna, najlepiej neutralna dla danej operacji 0 dla dodawania, 1 dla mnożenia, itd * @param reducer funkcja redukująca * @return wartosc zredukowana */ public static <A, B> A reduce(Iterable<B> iterable, A initialValue, Reducer<A, B> reducer) { Preconditions.checkNotNull(initialValue); A result = initialValue; for (B b : iterable) { result = reducer.reduce(result, b); } return result; } }
/** * funkcja redukująca * @param <A> klasa obiektu docelowego * @param <B> klasa obiektu wejsciowego */ public interface Reducer<A, B> { /** * redukuje parametr wejsciowy do docelowego * * @param to aktualny obiekt * @param from obiekt wejsciowy * @return zredukowany obiekt docelowy */ A reduce(A current, B from); }I samo wykorzystanie:
List<Integer> someNumbers = Lists.newArrayList(1, 2, 3); Reducer<Integer, Integer> sum = new Reducer<Integer, Integer>() { @Override public Integer reduce(Integer current, Integer from) { return current + from; } }; Integer sumValue = Iterables.reduce(someNumbers, 0, sum); assertThat(sumValue).isEqualTo(6);Niby nic wielce odkrywczego, ale taka jest cała Guava, która proste rzeczy zmienia w jeszcze prostsze lub też "standaryzuje" pewne operacje.
Jeśli komuś takie (funkcyjne) podejście nie bardzo pasuje, to radziłbym się zacząć przyzwyczajać. W kolejnej wersji Javy prawdopodobnie wejdą wyrażenia lambda, więc funkcyjność wkroczy do "czystej" Javy pełną parą.