İş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);
Nicole Kidman, Michael Keaton ve Val Kilmer'in Batman Olarak Paylaştığı Bu 1 Çekici Özelliğe Bayıldı
Gene Simmons, KISS Çizgi Romanlarının Potansiyel Olarak "İnsanlığı Yeniden Yaratabileceğini" Söyledi
Tom Girardi Dolandırıcılık Suçlamalarından Yargılanma Yetkisinin Belirlenmesi İçin Duruşmaya Katıldı
Kevin Jonas'ın Kızı Alena, Doğum Günü Fotoğrafında Büyümüş Görünüyor: '9 Yaşında Gerçek Hissetmiyor'