当前位置: 首页 > 知识库问答 >
问题:

如何理解流映射函数参数?

梅飞宇
2023-03-14

我对流图法有点困惑。有一些简单的源代码可以运行:

public static void main(String[] args) {
        List<String> words = Arrays.asList("hello", "world", "I", "love", "you");
        words.stream().map(String::length).forEach(System.out::println);

    }

map()签名:Stream map(函数

在我的选择中,我认为赋予文字的功能。stream()。map应该有1个参数,但是string::length没有任何输入参数,只返回int。

它看起来像word流调用字符串中的每个元素“word”。长度(),但我不知道该怎么做?为什么string::length签名不需要与函数签名(R apply(T))匹配?

非常感谢!

共有1个答案

姬温文
2023-03-14

Stream#map的工作是将一些代码应用于流内容中的每个元素,并收集该代码的输出以用作新流中的元素。

map方法将lambda或方法引用应用于流中的每个元素。您将方法引用String::length传递给了map方法调用。因此,第一个流询问每个“单词”字符串的长度。每个长度数字都成为一个新的数字流中的一个元素。

您对foreach调用作用于新的第二个数字流的元素。

你说:

它看起来像words stream invokeString中的每个元素“word”。length(),但我不知道该怎么做?

这就是Stream#map方法所做的工作:对流的每个元素应用String#length方法。每个长度的结果都会在代码中输入一个新的数字流。

你说:

我认为语言的功能。stream()。map应该有1个参数,但是string::length没有任何输入参数,只返回int。

长度是String类中的一个方法,因此每个String对象都携带该方法。

您有一个String对象的流。Stream#map方法将您的方法引用应用于它的每个元素。因此map在您的流的每个String对象(每个单词)上调用长度

 类似资料:
  • 我有以下Haskell表达式: 而我也有下面的表达: 我正试图弄清楚上面是否等同于第一个表达式。然而,当我在GHCI中尝试上面的表达式时,我得到了一个错误: 我不知道为什么这个表达不起作用。既然使用了函数组合,那么表达式的计算值不应该是:

  • 我正在结合Lombok和构建器模式使用MapSTRt。我有一个问题,即MapSTRt正在对生成的映射器函数中的所有参数进行显式空检查,并在所有参数为空的情况下提前退出,例如: 我想实现MapStruct不实现完整的空检查。即使所有参数都为null,它也应该设置整个生成器,并在生成器进行null检查(如果有)时调用build。

  • 我目前正在阅读一本Java8Lambdas的书(相当受欢迎),我对其中一个高级问题的答案中的一些语法感到困惑。 问题提出如下问题: 只使用reduce和lambda表达式编写函数'map'的实现。您可以返回而不是。 到目前为止,Java8 lambdas已经非常简单了,我觉得我似乎理解了书中的所有理论,但也许我误解了什么?我想知道我在这里错过了什么?

  • 流接口中的映射函数定义如下: 函数参数列表与函数接口自己的规范一致 方法是 这意味着它需要一个T,但返回一个R。但我正在运行这个代码 奇怪的是,为什么它能工作,但论点类型似乎不匹配?没有简单的方法来解释它,但我的理解是,一个函数应该接受类型T的输入并返回类型R。当它在流中使用时,它接受类型String的输入并返回类型int(即String.length())。但是小溪。map被键入以返回与流相同的

  • 我试图收集一个列表的结果,并将它们组织成一个地图,其中的值是一个地图: 我得到错误,因为对于列表中的不同值是相同的。 映射中包含的值应为: 当我尝试会删除其中一个条目

  • RDD转换和操作只能由驱动程序调用,不能在其他转换内部调用;例如,rdd1。地图(x)= 正如错误所说,我试图在主映射函数中映射(转换)一个JavaRDD对象,ApacheSpark怎么可能呢? 主要JavaPairRDD对象(TextFile和Word是定义的类): 和地图功能: 我还尝试了foreach映射函数,但不起作用。(当然还有SPARK-5063)