Lambdy w Javie

0

Jaka jest używalnośc lambd a javie? Mamy taki kod(tak lambdy w pythonie nie są najlepszym przykładem, ale...):

x = ["Abba was is a band from Sweden", "Cats", "Jolly Roger Pirate"]
    print(list(map(lambda x: x.lower(),x))) # -> ['abba is a band from sweden', 'cats', 'jolly roger pirate']

Czy jest jakaś droga do podobnego kodu w javie?

1

Będzie coś w stylu:

Stream.of(x).map(String::toLowerCase).forEach(System.out::println);

0

Dzięks, yhm, a co to jest to, co zwraca: java.util.stream.ReferencePipeline, to po prostu stream ? Mozna tam używać inne HOF? W miejsce toLowerCase, można dać dowolną funkcję?

1

Bardziej podobne do Python i do tego co jest we wszystkich normalnych językach jest VAVR http://www.vavr.io/.
I to Ci polecam. Stream z java.util. to troszkę obciążone dziedzicznie API, z którego raczej jest sens korzystać tylko jak gdzieś walczysz o "cykle" na mutowalnych kolekcjach. (Normalnie nieczęsto ).

A twój przykład wygląda wtedy tak:

import javaslang.collection.List;

[...]
  public static void main(String[] args) {
        List<String> x = List.of("Abba was is a band from Sweden", "Cats", "Jolly Roger Pirate");
        System.out.println(x.map( String::toLowerCase));//z method reference
        System.out.println(x.map( s ->s.toLowerCase())); //kanonicznie
    }
1
lion137 napisał(a):

Mozna tam używać inne HOF? W miejsce toLowerCase, można dać dowolną funkcję?

Można używać innych HOF, a jak mamy stream.map to przekazujemy instacje Function który z jakiegoś obiektu typu T robi obiekt typu V (oczywiście T i V mogą być w szczególności te same)

1

@lion137: to co napisałeś w pythonie to trochę abominacja i nie zaleca sie stosowania w ten sposób bezpośrednio map czy filter i zamiast tego robić:

[x.lower() for x in collection]

bo list comprehension wygodniej sie jednak czyta ;) W javie wygląda to lepiej jak masz więcej niż jedno wywołanie np.

List<T> result = data.stream()
    .map(x -> fun1(x))
    .map(x -> fun2(x))
    .map(x -> fun3(x))
    .map(x -> fun4(x))
    .filter(x -> predicate1(x))
    .filter(x -> predicate1(x))
    .filter(x -> predicate1(x))
    .filter(x -> predicate1(x))
    .collect(Collectors.toList());

Zapisanie tego samego w pythonie za pomocą list comprehension byloby masakrą, a z użyciem map() i filter() niewiele lepiej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1