Luồng chức năng []
Oct 27 2020
làm cách nào để sử dụng Stream cho Hàm []? Giải pháp của tôi trông rất xấu và tôi biết rằng điều này có thể được thực hiện bằng cách sử dụng 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;
}
}
Tôi chỉ có thể thay đổi chữ ký và nội dung của phương thức 'applyConversions'
Trả lời
2 Sweeper Oct 27 2020 at 09:04
Bạn dường như muốn reducecác chức năng sử dụng andThen. Giả sử conversionskhông thể để trống, bạn có thể làm:
static <T> T applyConversions(T value, Function<T, T>... conversions) {
return Arrays.stream(conversions).reduce(Function::andThen).get().apply(value);
}
Nếu nó có thể trống, bạn cần quyết định trả lại những gì khi nó trống.
return Arrays.stream(conversions).reduce(Function::andThen)
.map(x -> x.apply(value)).orElse(someDefaultValue);
Nếu bạn muốn nó sử dụng valuelàm giá trị mặc định, bạn thực hiện orElse(Function.identity())thay vì getchọn tùy chọn.
return Arrays.stream(conversions)
.reduce(Function::andThen).orElse(Function.identity())
.apply(value);