İşlev Akışı []

Oct 27 2020

Stream for Function [] nasıl kullanabilirim? Çözümüm çok çirkin görünüyor, artı bunu azaltmak () kullanarak yapılabileceğini biliyorum.

class A {   
    static void run() {
        Integer a = applyConversions(3, x -> x * 3, x -> x + 4);                  // output: 13

        String b = applyConversions("One", s -> "Two " + s, String::toUpperCase); // output: OneTwo
    }

    static <T> T applyConversions(T value, Function<T, T>... conversions) {
        /*
        todo: apply each conversion function to 'value'

        ==>My Ugly solution<==
        final Object[] valueHelper = {null};
        valueHelper[0] = value;
        Stream.of(conversions).forEach(s-> valueHelper[0] = s.apply((T)valueHelper[0]));
        return (T)valueHelper[0];
        */
        return value;
    }
}

'ApplyConversions' yönteminin yalnızca imzasını ve gövdesini değiştirebilirim

Yanıtlar

2 Sweeper Oct 27 2020 at 09:04

reduceİşlevleri kullanmak istiyor gibisin andThen. conversionsBoş olamayacağını varsayarsak , şunları yapabilirsiniz:

static <T> T applyConversions(T value, Function<T, T>... conversions) {
    return Arrays.stream(conversions).reduce(Function::andThen).get().apply(value);
}

Boş olabilirse, boş olduğunda ne iade edeceğinize karar vermeniz gerekir.

return Arrays.stream(conversions).reduce(Function::andThen)
        .map(x -> x.apply(value)).orElse(someDefaultValue);

valueVarsayılan değer olarak kullanılmasını istiyorsanız , isteğe bağlı orElse(Function.identity())yerine bunu yaparsınız get.

return Arrays.stream(conversions)
   .reduce(Function::andThen).orElse(Function.identity())
   .apply(value);