Stream接口中的map函数的定义如下:
<R> Stream<R> map(Function<? super T,? extends R> mapper)
Function参数列表与Function接口自己的规范一致
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,在这种情况下为String,即不是int):<R> Stream<R> map(Function<? super T,? extends R> mapper)
。
那么这是怎么回事?提前致谢。
答案 0 :(得分:3)
您在map
上调用的Stream
方法采用类型为mapper
的{{1}}。因此,这里有两种通用类型:Function<? super T, ? extends R>
和T
。
R
是已处理流的元素类型。
T
根据API
新流的元素类型
您的R
取一个mapper
并返回其String
。 String.length()
的返回类型是String.length()
。这是结果流元素的类型。这样您的映射器就输入了
int
,因为Function<? super String, ? extends Integer>
被自动装箱到int
。
答案 1 :(得分:1)
要了解它,让我们看一下lengh函数。
要使此功能正常工作,它需要一个String类型的对象,而无需调用任何参数。它会返回一个可以包装在Integer中的int原语。
那么,如果我们可以将其转换成Function怎么办?我们需要一个参数o String作为对象,并需要一个Integer返回值,因此下一个代码将起作用:
map函数用于按相同顺序对列表的元素进行某种计算,然后返回结果。您可以找到更多的here。
所以现在很清楚前提:
<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”都将做同样的事情,这就是为什么您的代码有效。