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

我试图在下一个例子之后理解一些东西:

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

     . (etc.)

为什么 mapToInt 需要

    Integer::parseInt

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


暮色呼如
浏览 331回答 2
2回答

猛跑小猪

区分调用的Stream#mapToInt(ToIntFunction)作用和参数ToIntFunction的作用很重要。对 的调用mapToInt是流将要执行的操作(即将元素映射到)int。参数ToIntFunction是流将如何int将每个元素映射到.他们是否可以包含一个将s 隐式解析为s的无参数mapToInt方法?是的,但看看它的效果如何——这种情况远不及无参数方法那样随意或模棱两可。StringintStream#sorted()mapToInt无参数sorted方法假定元素是ComparableJava 中一个基本的、标准化的和广泛使用的接口——任何类都可以实现该接口(而只有一个类可以是 )String。因此,虽然该方法不是类型安全的,但可以说用例足够普遍以证明其存在的合理性。mapToInt但是,假设元素为Strings 并将其内容解析为 an 的无参数方法int是一个高度特定的用例。为什么这样一个通用的 API 会提供这样一个特定的操作?这将是一个完全武断的决定,没有合理的理由。例如,为什么不将每个映射String到它的length呢?为什么要String特别处理而不是其他类型?因此,该方法接受一个ToIntFunction参数,该参数描述如何int根据具体情况将元素映射到。注意到Integer::parseInt是一个方法引用可能会有所帮助,它是普通lambda 表达式的简写。两者都是功能接口的实现,比使用匿名类更简洁。换句话说,您正在创建一个新ToIntFunction实例并将其作为参数传递。以下所有内容在功能上都是等效的:// method referencestream.mapToInt(Integer::parseInt)// lambda expressionstream.mapToInt((String value) -> Integer.parseInt(value)) // explicit parameter typesstream.mapToInt(value -> Integer.parseInt(value))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // implicit parameter types// anonymous classstream.mapToInt(new ToIntFunction<>() {&nbsp; &nbsp; @Override&nbsp; &nbsp; public int applyAsInt(String value) {&nbsp; &nbsp; &nbsp; &nbsp; return Integer.parseInt(value);&nbsp; &nbsp; }})哪里stream是一个Stream<String>。

慕田峪7331174

你正在做的操作是这样的:Stream.of("a1",&nbsp;"a2",&nbsp;"a3")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//step1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(s&nbsp;->&nbsp;s.substring(1))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//step2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mapToInt(Integer::parseInt)&nbsp;&nbsp;//step3 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.max()您定义了一个字符串流(在第 1 步中),然后您将它们中的每一个丢弃掉上面的 1 个字符,留下“1”、“2”和“3”流,(第 2 步)但请注意,它们仍然是字符串对象...然后将其转换为整数,因此您需要为“mapToInt”提供一个以字符串作为参数并返回整数的“函数”(第 3 步)这是在 Integer 类中定义的:https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String)您当然可以编写并传递自己的函数……但是为什么要重新发明轮子呢?:)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java