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

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


撒科打诨
浏览 211回答 2
2回答

繁星点点滴滴

将map要调用的-方法Stream需要mapper与类型Function<? super T, ? extends R>。因此,这里有两种通用类型:T和R。&nbsp;T是已处理流的元素类型。&nbsp;R&nbsp;根据API新流的元素类型您mapper取String并返回String.length()。的返回类型String.length()是int。这是结果流元素的类型。因此,您的映射器已输入Function<?&nbsp;super&nbsp;String,&nbsp;?&nbsp;extends&nbsp;Integer>因为int会自动装箱到Integer。

鸿蒙传说

为了理解它,让我们看一下lengh函数。因此,要使此功能正常工作,需要一个String类型的对象,而无需调用任何参数。它返回的可能是可以包装在Integer中的int原语。那么,如果我们可以将其转换成Function呢?我们需要一个参数o String作为对象,并需要一个Integer返回值,因此下一个代码将起作用:map函数用于以相同顺序对列表的元素进行某种计算,然后返回结果。您可以在这里找到更多。因此,现在很明显,前提是:<R>&nbsp;Stream<R>&nbsp;map(Function<?&nbsp;super&nbsp;T,?&nbsp;extends&nbsp;R>&nbsp;mapper)将与:Stream<String>&nbsp;s&nbsp;=&nbsp;Stream.of("monkey",&nbsp;"gorilla",&nbsp;"bonobo"); s.map(String::length).forEach(System.out::print);&nbsp;//&nbsp;676如果要重新创建函数,则应执行以下操作:Function<String,&nbsp;Integer>&nbsp;z&nbsp;=&nbsp;(s)&nbsp;->&nbsp;s.length();“ i”和“ z”都将执行相同的操作,因此这就是您的代码起作用的原因。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java