समारोह की धारा []
Oct 27 2020
मैं फंक्शन [] के लिए स्ट्रीम का उपयोग कैसे कर सकता हूं? मेरा समाधान बहुत बदसूरत लग रहा है प्लस मुझे पता है कि यह कम () का उपयोग करके किया जा सकता है।
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' विधि के हस्ताक्षर और निकाय बदल सकता हूं
जवाब
2 Sweeper Oct 27 2020 at 09:04
आप reduceका उपयोग कर कार्य करना चाहते हैं andThen। यह मानते हुए कि conversionsआप खाली नहीं हैं, आप कर सकते हैं:
static <T> T applyConversions(T value, Function<T, T>... conversions) {
return Arrays.stream(conversions).reduce(Function::andThen).get().apply(value);
}
यदि यह खाली हो सकता है, तो आपको यह तय करने की आवश्यकता है कि खाली होने पर क्या लौटना है।
return Arrays.stream(conversions).reduce(Function::andThen)
.map(x -> x.apply(value)).orElse(someDefaultValue);
यदि आप इसे valueडिफ़ॉल्ट मान के रूप में उपयोग करना चाहते हैं , तो आप वैकल्पिक orElse(Function.identity())को getटिंग करने के बजाय करते हैं ।
return Arrays.stream(conversions)
.reduce(Function::andThen).orElse(Function.identity())
.apply(value);