【问题标题】:Java Stream interface map function argument typesJava Stream 接口映射函数参数类型
【发布时间】: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):&lt;R&gt; Stream&lt;R&gt; map(Function&lt;? super T,? extends R&gt; mapper)。 那么这里发生了什么?提前致谢。

【问题讨论】:

  • 当函数没有参数时(例如length),在当前流元素上调用该函数。这意味着您的map(String::length) 与写map(s-&gt; s.length()) 相同。
  • “但是 Stream.map 被输入以返回与流相同的类型” - 这是不正确的。原始流传递 T 的实例(因此 apply(T t))并返回 R 实例的流(因为对 apply 的每次调用都返回一个 R)。

标签: java dictionary java-stream


【解决方案1】:

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

所以要让这个函数工作,它需要一个字符串类型的对象,并且不需要调用任何参数。它将返回比可以包装在 Integer 中的 int 原语。

那么如果我们可以将它转换成一个函数呢?我们需要一个参数 o String 作为一个对象和一个 Integer 的返回,所以下面的代码可以工作:

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”都将执行相同的操作,这就是您的代码有效的原因。

【讨论】:

    【解决方案2】:

    您在Stream 上调用的map 方法采用mapper 类型为Function&lt;? super T, ? extends R&gt;。所以这里有两种泛型:TRT 是处理流的元素类型。 R是根据API

    新流的元素类型

    您的mapper 接受String 并返回其String.length()String.length() 的返回类型是 int。这是结果流的元素的类型。所以你的映射器是输入的

    Function<? super String, ? extends Integer>
    

    因为int 被自动装箱为Integer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-15
      • 2023-01-29
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 2021-04-17
      相关资源
      最近更新 更多