[英]method map in interface java.util.stream.Stream<T> cannot be applied to given types;
[英]Java Stream interface map function argument types
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,在本例中为 String ie NOT an int): <R> Stream<R> map(Function<? super T,? extends R> mapper)
。 那么这里发生了什么? 提前致谢。
该map
-方法要调用的Stream
需要一个mapper
与类型Function<? super T, ? extends R>
Function<? super T, ? extends R>
Function<? super T, ? extends R>
。 所以这里有两种通用类型: T
和R
。 T
是已处理流的元素类型。 R
是根据API
新流的元素类型
您的mapper
接受一个String
并返回其String.length()
。 String.length()
的返回类型是int
。 这是结果流的元素类型。 所以你的映射器被输入
Function<? super String, ? extends Integer>
因为int
被自动装箱为Integer
。
为了理解它,让我们看一下 lengh 函数。
所以要让这个函数工作,它需要一个 String 类型的对象,并且没有要调用的参数。 它将返回一个可以包装在整数中的 int 原语。
那么如果我们可以将它转换为一个函数呢? 我们需要一个参数 o String 作为一个对象和一个返回的整数,所以下一个代码将起作用:
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" 都会做同样的事情,这就是你的代码有效的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.