함수의 흐름 []
Oct 27 2020
Stream for Function []을 어떻게 사용할 수 있습니까? 내 솔루션은 매우 추악 해 보이며 reduce ()를 사용하여 수행 할 수 있다는 것을 알고 있습니다.
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);