【问题标题】:Java Stream API map argumentJava Stream API 映射参数
【发布时间】:2018-04-20 08:00:28
【问题描述】:

我对 Java 8 静态方法引用有一些误解。

以下说法正确:

Stream.of("aaa", "bbb", "cccc").map(String::length);

AFAIK map 需要 Function<T, R> interface 作为参数,其方法类似于:

R apply(T t);

但是,String 类的 length() 方法不接受任何参数:

public int length() {
    return value.length;
}

1) 它与需要参数T tapply 方法有何关联?

2) 如果我写 String::someMethod 是否意味着 someMethod 应该是静态的(因为我是通过类名而不是对象引用来调用它)?

谢谢!

【问题讨论】:

  • 要调用该方法的对象实例是您正在寻找的缺失参数。请注意您是如何映射到 String 实例流的。
  • 在这种情况下,只需将方法引用替换为 lambda 表达式以便更好地理解。

标签: java java-8 java-stream


【解决方案1】:

不,String::someMethod 并不意味着方法必须是静态的。它可以是静态方法,也可以是在某个String 实例上执行的实例方法。该实例将用作该方法引用实现的功能接口的单个​​方法的隐式参数。

因此,String::length 确实有一个参数 - 将在其上调用 length 方法的 String 实例。

String::length 等效于 lambda 表达式 (String s) -> s.length()(或只是 s -> s.length())。

当您编写Stream.of("aaa", "bbb", "cccc").map(String::length) 时,将为您的Stream 的每个元素执行length() 方法(假设您添加一些终端操作导致map 在这些元素上被评估)这将改变您的@ 987654333@ 到Stream<Integer>

【讨论】:

    【解决方案2】:

    当您将 lambdas/方法引用扩展到匿名内部类时,它会使事情更容易理解。当您将方法引用替换为匿名类时,您的语句将转换为这样的内容:

    Stream.of("aaa", "bbb", "cccc").map(new Function<String, Integer>() {
        @Override
        public Integer apply(String s) {
            return s.length();
        }
    }); 
    

    正如您在此处看到的,输入是字符串,它返回的字符串长度是整数。它遵循您提到的Function 功能接口定义。

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 1970-01-01
      • 2018-10-25
      • 2019-04-19
      • 2021-09-13
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多