为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

暮色呼如 2023-03-09 14:55:39
我试图在下一个例子之后理解一些东西:    Stream.of("a1", "a2", "a3")             .map(s -> s.substring(1))             .mapToInt(Integer::parseInt)             .max()      . (etc.)为什么 mapToInt 需要    Integer::parseInt作为参数?它不应该是隐含的吗?这个参数不是多余的吗?
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

区分调用的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 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>。


查看完整回答
反对 回复 2023-03-09
?
慕田峪7331174

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)

您当然可以编写并传递自己的函数……但是为什么要重新发明轮子呢?:)


查看完整回答
反对 回复 2023-03-09
  • 2 回答
  • 0 关注
  • 316 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信