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

Java Stream接口映射函数参数类型

Java Stream接口映射函数参数类型

撒科打诨 2021-04-08 16:18:48
Stream接口中的map函数的定义如下:<R> Stream<R> map(Function<? super T,? extends R> mapper)功能参数列表与功能接口自己的规范一致Interface Function<T,R>方法是R apply(T t)这意味着它需要一个T却返回一个R。但是我正在运行这段代码import java.util.stream.*;import java.util.function.*;public class T3 {    public static void main(String...args){        mapTest();            }        static void mapTest(){        Stream<String> s = Stream.of("monkey", "gorilla", "bonobo");        s.map(String::length).forEach(System.out::print); // 676            }}想知道,它如何工作,但参数类型似乎不匹配?没有简单的方法来解释它,但是我的理解是一个Function应该接受T类型的输入并返回R类型。当在流中使用它时,它接受String类型的输入并返回int类型。(即string.length())。但Stream.map键入返回相同类型的流(即R,在这种情况下字符串即不是int): <R> Stream<R> map(Function<? super T,? extends R> mapper)。那么这是怎么回事?提前致谢。
查看完整描述

2 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

map要调用的-方法Stream需要mapper与类型Function<? super T, ? extends R>。因此,这里有两种通用类型:TR。 T是已处理流的元素类型。 R 根据API

新流的元素类型

mapperString并返回String.length()。的返回类型String.length()int。这是结果流元素的类型。因此,您的映射器已输入

Function<? super String, ? extends Integer>

因为int会自动装箱到Integer


查看完整回答
反对 回复 2021-04-14
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

为了理解它,让我们看一下lengh函数。

//img1.sycdn.imooc.com//6076a7330001ce8107470232.jpg

因此,要使此功能正常工作,需要一个String类型的对象,而无需调用任何参数。它返回的可能是可以包装在Integer中的int原语。

那么,如果我们可以将其转换成Function呢?我们需要一个参数o String作为对象,并需要一个Integer返回值,因此下一个代码将起作用:

//img1.sycdn.imooc.com//6076a74c000111ac04200028.jpg

map函数用于以相同顺序对列表的元素进行某种计算,然后返回结果。您可以在这里找到更多。

因此,现在很明显,前提是:

<R> Stream<R> map(Function<? super T,? extends R> mapper)

将与:

Stream<String> s = Stream.of("monkey", "gorilla", "bonobo");
s.map(String::length).forEach(System.out::print); // 676

如果要重新创建函数,则应执行以下操作:

Function<String, Integer> z = (s) -> s.length();

“ i”和“ z”都将执行相同的操作,因此这就是您的代码起作用的原因。


查看完整回答
反对 回复 2021-04-14
  • 2 回答
  • 0 关注
  • 210 浏览

添加回答

举报

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