s.substring(1)) -6ren">
gpt4 book ai didi

Java 8 Streams:为什么mapToInt需要Integer::parseInt作为参数?

转载 作者:行者123 更新时间:2023-12-03 23:05:09 26 4
gpt4 key购买 nike

我试图理解下一个示例中的一些内容:

    Stream.of("a1", "a2", "a3")
.map(s -> s.substring(1))
.mapToInt(Integer::parseInt)
.max()

. (etc.)

为什么mapToInt需要

    Integer::parseInt 

作为参数?难道不应该是隐含的吗?这个参数是不是多余了?

最佳答案

区分调用 Stream#mapToInt(ToIntFunction) 很重要 ToIntFunction 的作用和用途论证确实如此。

  • 调用mapToInt是流要执行的操作(即将元素映射到 int )。
  • ToIntFunction参数是流如何将每个元素映射到 int .

他们是否可以包含一个无参数 mapToInt隐式解析 String 的方法发送至int是?是的,但是look at how well that works for Stream#sorted() ——这种情况远不像无参数 mapToInt 那样任意或模糊。方法。

无参数 sorted方法假设元素是 Comparable这是 Java 中一个基本的、标准化的、广泛使用的接口(interface)——任何类都可以实现该接口(interface)(而只有一个类可以是 String )。因此,虽然该方法不是类型安全的,但可以认为用例足够常见以证明其存在的合理性。

但是,无参数 mapToInt假设元素为 String 的方法s 并将其内容解析为 int是一个非常具体的用例。为什么这样一个通用的 API 会提供这样一个特定的操作?这将是一个完全武断的决定,没有合理的理由。例如,为什么不映射每个 String到其length反而?为什么是 String被特殊处理但不是其他类型?因此该方法接受 ToIntFunction描述如何将元素映射到 int 的参数视具体情况而定。


注意到Integer::parseInt可能会有所帮助。是 method reference ,这是一个简单的 lambda expression 的简写。两者都是 functional interface 的实现这比使用 anonymous class 更简洁。 。换句话说,您正在创建一个新的 ToIntFunction实例并将其作为参数传递。

以下所有内容在功能上都是等效的:

// method reference
stream.mapToInt(Integer::parseInt)

// lambda expression
stream.mapToInt((String value) -> Integer.parseInt(value)) // explicit parameter types
stream.mapToInt(value -> Integer.parseInt(value)) // implicit parameter types

// anonymous class
stream.mapToInt(new ToIntFunction<>() {

@Override
public int applyAsInt(String value) {
return Integer.parseInt(value);
}

})

哪里streamStream<String> .

关于Java 8 Streams:为什么mapToInt需要Integer::parseInt作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56913567/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com