【问题标题】:map pipeline operator associated with function interface映射与函数接口关联的管道运算符
【发布时间】:2020-07-03 10:49:56
【问题描述】:

我不明白为什么String::toUpperCase() 表达式在流map 管道 中可以正常工作。当我在这里看这个例子时:

Stream.of("test1", "test2", "test3", "test4")
                .filter(s -> s.contains("r"))
                .map(s -> s + "map")
                .map(String::toUpperCase)
                .forEach(System.out::println);

当我查看下面示例map(Function<? super String, ? extends String> mapper) 中使用的映射运算符的定义时,我看到使用了函数设计模式。

在这个例子中.map(s -> s + "map") 很好,据我了解,我们正在寻找更精确的函数 R apply(T t);,这完全是 lambda 表达式所说的 s -> s + "map" 这里我们有一个带有参数 s 的函数,它返回s + String "map" 并且它符合这个规范。 TR,他们在场。

另一边第二个map(String::toUpperCase),我不明白为什么toUpperCase这个表达式被认为是Function接口,我要注意这个函数的核心是这样的

public String toUpperCase() {
    return toUpperCase(Locale.getDefault());
}

我们正在寻找R apply(T t); 这个方法中没有T 参数toUpperCase?为什么这个有效?

【问题讨论】:

    标签: java java-8 functional-programming java-stream mapping


    【解决方案1】:

    Function 接口的apply 方法而言,更容易理解的是方法引用String::toUpperCase 的匿名类表示。是这样的——

    new Function<String, String>() {
        @Override
        public String apply(String str) { // read as given a String return a String (uppercased)
            return str.toUpperCase();
        }
    }
    

    提供给上述apply方法的字符串参数(str)是在前面的map操作之后来自Stream的参数。

    【讨论】:

      【解决方案2】:

      它被称为方法引用,它是 lambda 表达式的语法糖。换句话说,如下:

      String::toUpperCase
      

      相当于:

      s -> s.toUpperCase()
      

      这是一个接受 String s 并返回 String 的方法,其中所有来自 s 的字母大写,它是 Function&lt;String, String&gt;

      【讨论】:

      • 该方法必须与带有 lambdas s->s.toUpperCase() 的功能接口R apply(T t) 具有相同的签名,这对我来说非常清楚,我看不到 String::toUpperCase传递的参数,这个签名定义是空的,它返回一个字符串!你能解释一下这一点吗
      • 例如这个 .forEach(System.out::println); .forEach(s-> System.out.println(s));我不明白它们是相同的,方法参考 println,消费者寻找 void accept(T t) 方法;并且返回void,println的核心定义是conforme public void println(String x),只有一个参数并且返回void
      • @Feres.o 你完全误解了这一点。如果我有一个函数String f(String s, int i, double d, char c) 并像s -&gt; f(s, 1, 2.3, 'a') 一样调用它怎么办?该函数接受 4 个参数,但没关系,因为 lambda 只接受并返回一个。
      • 对我来说是 (s, i , d, c) -> { statements then return a String }
      • @Feres.o 内部函数其他参数固定
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2016-01-26
      • 2017-08-30
      相关资源
      最近更新 更多