2 回答
TA贡献1858条经验 获得超8个赞
区分调用的Stream#mapToInt(ToIntFunction)
作用和参数ToIntFunction
的作用很重要。
对 的调用
mapToInt
是流将要执行的操作(即将元素映射到)int
。参数
ToIntFunction
是流将如何int
将每个元素映射到.
他们是否可以包含一个将s 隐式解析为s的无参数mapToInt
方法?是的,但看看它的效果如何——这种情况远不及无参数方法那样随意或模棱两可。String
int
Stream#sorted()
mapToInt
无参数sorted
方法假定元素是Comparable
Java 中一个基本的、标准化的和广泛使用的接口——任何类都可以实现该接口(而只有一个类可以是 )String
。因此,虽然该方法不是类型安全的,但可以说用例足够普遍以证明其存在的合理性。
mapToInt
但是,假设元素为String
s 并将其内容解析为 an 的无参数方法int
是一个高度特定的用例。为什么这样一个通用的 API 会提供这样一个特定的操作?这将是一个完全武断的决定,没有合理的理由。例如,为什么不将每个映射String
到它的length
呢?为什么要String
特别处理而不是其他类型?因此,该方法接受一个ToIntFunction
参数,该参数描述如何int
根据具体情况将元素映射到。
注意到Integer::parseInt
是一个方法引用可能会有所帮助,它是普通lambda 表达式的简写。两者都是功能接口的实现,比使用匿名类更简洁。换句话说,您正在创建一个新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);
}
})
哪里stream是一个Stream<String>。
TA贡献1828条经验 获得超13个赞
你正在做的操作是这样的:
Stream.of("a1", "a2", "a3") //step1 .map(s -> s.substring(1)) //step2 .mapToInt(Integer::parseInt) //step3 .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)
您当然可以编写并传递自己的函数……但是为什么要重新发明轮子呢?:)
添加回答
举报