【问题标题】:Why list of String has no forEach method?为什么 String 列表没有 forEach 方法?
【发布时间】:2019-12-07 19:46:32
【问题描述】:

我不明白为什么String[] args 变量没有forEach 方法?因为forEach methos 实现了Serializable,所以我找不到任何关于这种类型不是Serializable 或Collection 的信息。

例如,我有一个简单的主要 Java 类。如果我想使用forEach 方法,我必须先导入Arrays 类,然后在stream 上使用forEach 方法,如下所示:

import java.util.Arrays;

public class MyClass {
  public static void main(String[] args) {
    Arrays.stream(args).forEach(System.out::println);
  }
}

为什么不能像这样简单?

args.forEach(System.out::println);

【问题讨论】:

  • args 是一个数组,而不是 List

标签: java arrays string foreach


【解决方案1】:

简答:数组没有定义forEach 方法。

更长的答案:因为它不需要它。数组类型(使用[],而不是List<>)表示内存中的低级结构,更适合低级优化而不是高级函数式代码。机器的硬件更类似于 C 等语言中的命令式、有状态风格,而不是 Haskell 等语言中的函数式无状态风格。因此,在创建像基本数组这样的较低级别的数据结构时,赋予它更高级的功能并不一定有意义。如果你真的想要一个forEach() 方法,可以使用Arrays.asList()Arrays.stream()List.of()(取决于Java 版本)简单地包装它。

【讨论】:

  • 我不同意“因为,它不需要它”部分。该语言正在开发中,非常强大的 Stream API 和 Collection API 正在逐个版本显着增强,数组看起来像恐龙......
  • 您可以在不破坏其背后的“低级结构”思想的情况下实现方便的方法。
  • 如果您将 forEach 提供给数组,为什么不添加过滤器、映射和其他流方法。最终你会将数组变成流。虽然这本质上并不是坏事,但拥有仅用于支持更多用户友好界面的“恐龙”本身并没有什么坏处。无论如何,问题是“为什么它没有 forEach 方法”。因为该语言的设计者认为它不值得投入,尤其是在 Collection 和 Stream 存在的情况下
  • 如果我要实现它,我会将stream()parallelStream()spliterator()forEach() 添加到Collection。这不是用Stream's 或Collection's 方法弄乱数组,更多的是为新的语言特性添加有用的“转换方法”。对我来说,写list.stream() 比写Arrays.stream(array) 更方便,而且我认为以不同的方式处理数组没有意义。另一方面,我知道向Arrays添加一堆重载方法要容易得多...
  • 我明白你的意思。我猜“Java 设计者认为我们不需要它”更准确
【解决方案2】:

main 方法接受一个String[] 类型的参数。这是Strings 中的Array

Lists 和 Arrays 是两个不同的东西,只有前者提供了 foreach 方法。

【讨论】:

    【解决方案3】:

    不只是字符串数组,任何对象或原始类型的数组都没有这个特性,因为数组是不同于其他集合实现的数据结构

    【讨论】:

    • 这可能更适合放在评论中,但还是要注意
    【解决方案4】:
    1. 数组类型的直接超类是Object
    2. 每个数组类型都实现了接口Cloneablejava.io.Serializable

    https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html

    任何数组类型都没有定义forEach

    为什么?

    它根本没有实现,作者显然希望从根本上保持数组类型尽可能纯。

    我不认为这种方法是多余的;相反,我相信它会非常方便。不过,这不是一项微不足道的任务。考虑一下原始数组以及如何实现,比如说,boolean 消费者。您必须将一个普通的 JDK 类 BooleanConsumer 绑定到一个基本的 JVM 概念 boolean[],或者将接口赋予特殊状态,或者动态生成接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 2013-02-02
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      相关资源
      最近更新 更多