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>
。因此,这里有两种通用类型:T
和R
。 T
是已处理流的元素类型。 R
根据API
新流的元素类型
您mapper
取String
并返回String.length()
。的返回类型String.length()
是int
。这是结果流元素的类型。因此,您的映射器已输入
Function<? super String, ? extends Integer>
因为int
会自动装箱到Integer
。
鸿蒙传说
TA贡献1865条经验 获得超7个赞
为了理解它,让我们看一下lengh函数。
因此,要使此功能正常工作,需要一个String类型的对象,而无需调用任何参数。它返回的可能是可以包装在Integer中的int原语。
那么,如果我们可以将其转换成Function呢?我们需要一个参数o String作为对象,并需要一个Integer返回值,因此下一个代码将起作用:
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”都将执行相同的操作,因此这就是您的代码起作用的原因。
添加回答
举报
0/150
提交
取消