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

时间:2018-06-19 15:25:29

标签: java dictionary java-stream

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)。 那么这是怎么回事?提前致谢。

2 个答案:

答案 0 :(得分:3)

您在map上调用的Stream方法采用类型为mapper的{​​{1}}。因此,这里有两种通用类型:Function<? super T, ? extends R>TR是已处理流的元素类型。 T根据API

  

新流的元素类型

您的R取一个mapper并返回其StringString.length()的返回类型是String.length()。这是结果流元素的类型。这样您的映射器就输入了

int

,因为Function<? super String, ? extends Integer> 被自动装箱到int

答案 1 :(得分:1)

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

enter image description here

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

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

enter image description here

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”都将做同样的事情,这就是为什么您的代码有效。