Function
接口(interface)的许多 lambda 都采用以下形式
t -> {
// do something to t
return t;
}
我经常这样做,所以我为此编写了一个方法。
static <T> Function<T, T> consumeThenReturn(Consumer<T> consumer) {
return t -> {
consumer.accept(t);
return t;
};
}
这使我能够像这样做非常好的事情:
IntStream.rangeClosed('A', 'Z')
.mapToObj(a -> (char) a)
.collect(Collectors.collectingAndThen(Collectors.toList(), consumeThenReturn(Collections::shuffle)))
.forEach(System.out::print);
有没有另一种方法可以不依赖我自己的方法来进行这样的转换?新 API 中是否有任何我遗漏的内容使我的方法变得多余?
最佳答案
有许多潜在有用的方法可以添加到Function
、Consumer
和Supplier
接口(interface)。您给出了一个很好的示例(将 Consumer
转换为 Function
),但还有许多其他潜在的转换或实用程序可以添加。例如,使用 Function
作为 Consumer
(通过忽略返回值)或作为 Supplier
(通过提供输入值)。或者通过提供任一值将 BiFunction
转换为 Function
。当然,所有这些都可以在代码中手动完成或通过您所展示的实用程序函数提供,但可以说,在 API 中拥有标准化机制可能很有值(value),就像许多其他语言中存在的那样。
这是我的猜测,但我猜这反射(reflect)了语言设计者希望让 API 尽可能干净。然而,我对语言提供的一组非常丰富的 Comparator
实用程序的对比(作为示例)很感兴趣,这些实用程序可以颠倒顺序,按几个标准进行比较,处理空值等。这些也可以很容易留给用户,但由 API 提供。我很想听听一位语言设计者为什么这些接口(interface)的方法看起来如此不一致。
关于java - 将消费者转换为函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36392228/