Pau*_*ton 15 java java-8 java-stream
Function接口的许多lambda都采用了这种形式
t -> {
// do something to t
return t;
}
Run Code Online (Sandbox Code Playgroud)
我经常这样做,所以我已经为此编写了一个方法.
static <T> Function<T, T> consumeThenReturn(Consumer<T> consumer) {
return t -> {
consumer.accept(t);
return t;
};
}
Run Code Online (Sandbox Code Playgroud)
这使我能够做到这样的非常好的事情:
IntStream.rangeClosed('A', 'Z')
.mapToObj(a -> (char) a)
.collect(Collectors.collectingAndThen(Collectors.toList(), consumeThenReturn(Collections::shuffle)))
.forEach(System.out::print);
Run Code Online (Sandbox Code Playgroud)
还有另一种方法可以在不依赖我自己的方法的情况下进行这样的转换吗?我错过的新API中有什么东西会让我的方法变得多余吗?
有许多潜在的有用的方法,可以被添加到Function,Consumer和Supplier接口.您举了一个很好的例子(将a转换Consumer为a Function),但还有许多其他潜在的转换或实用程序可以添加.例如,使用Functionas Consumer(通过忽略返回值)或作为Supplier(通过提供输入值).或者通过提供任一值将a转换BiFunction为a Function.当然,所有这些都可以在代码中手动完成,或者如您所示通过实用程序功能提供,但在API中具有标准化机制可能是有价值的,如许多其他语言中所存在的那样.
这是我的猜测,但我猜这反映了语言设计者希望尽可能保持API的清洁.然而,我对Comparator这种语言提供的非常丰富的实用程序的对比(作为一个例子)很感兴趣,它可以通过几个标准进行比较,处理空值等等.这些也很容易留给用户但是已由API提供.我很想知道其中一位语言设计师为什么这些接口的方法看起来如此不一致.
| 归档时间: |
|
| 查看次数: |
1836 次 |
| 最近记录: |