java - 将消费者转换为函数

标签 java java-8 java-stream

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 中是否有任何我遗漏的内容使我的方法变得多余?

最佳答案

有许多潜在有用的方法可以添加到FunctionConsumerSupplier 接口(interface)。您给出了一个很好的示例(将 Consumer 转换为 Function),但还有许多其他潜在的转换或实用程序可以添加。例如,使用 Function 作为 Consumer(通过忽略返回值)或作为 Supplier(通过提供输入值)。或者通过提供任一值将 BiFunction 转换为 Function。当然,所有这些都可以在代码中手动完成或通过您所展示的实用程序函数提供,但可以说,在 API 中拥有标准化机制可能很有值(value),就像许多其他语言中存在的那样。

这是我的猜测,但我猜这反射(reflect)了语言设计者希望让 API 尽可能干净。然而,我对语言提供的一组非常丰富的 Comparator 实用程序的对比(作为示例)很感兴趣,这些实用程序可以颠倒顺序,按几个标准进行比较,处理空值等。这些也可以很容易留给用户,但由 API 提供。我很想听听一位语言设计者为什么这些接口(interface)的方法看起来如此不一致。

关于java - 将消费者转换为函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36392228/

相关文章:

java - 使用流生成 short[]

java - 创建 lambda 表达式的字符串表示形式

java - 将 List<HashMap<String, Object>> 转换为流

java - RC4加密java

java - 文件读取失败且没有明确原因 - Java

Java - 使用 JAMA 创建具有随机值的 3by3 矩阵

java - 使用 Java 8 在文件中查找模式

Java 8 : Stream, NIO 和 Lambda

java - 将一组 InternetAddress 转换为一组 String

java - JSONObject 抛出异常