繁体   English   中英

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

[英]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> 所以这里有两种通用类型: TR 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM