【发布时间】:2018-11-28 15:04:30
【问题描述】:
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
}
}
并且想知道,为什么它可以工作,但参数类型却不匹配似乎?
没有简单的方法来解释它,但我的理解是一个函数应该接受 T 类型的输入并返回 R 类型。当它在流中使用时,它接受 String 类型的输入并返回 int 类型。 (即 string.length())。但 Stream.map 的类型是返回 与流相同的类型(即 R,在这种情况下为字符串,即不是 int):<R> Stream<R> map(Function<? super T,? extends R> mapper)。
那么这里发生了什么?提前致谢。
【问题讨论】:
-
当函数没有参数时(例如
length),在当前流元素上调用该函数。这意味着您的map(String::length)与写map(s-> s.length())相同。 -
“但是 Stream.map 被输入以返回与流相同的类型” - 这是不正确的。原始流传递 T 的实例(因此
apply(T t))并返回 R 实例的流(因为对apply的每次调用都返回一个 R)。
标签: java dictionary java-stream