为什么 Java 中的 String 类不实现 Iterable?

2022-08-31 19:57:23

然而,许多Java框架类没有实现。迭代 中的字符是有意义的,就像可以迭代常规数组中的项一样。IterableStringString

不实现的原因是什么?StringIterable


答案 1

真的没有一个好的答案。Java中的迭代器专门适用于离散项(对象)的集合。你可能会认为,实现 的 a 应该是离散字符的“集合”。相反,它被视为恰好由字符组成的单个实体。StringCharSequence

在Java中,迭代器似乎只应用于集合,而不是字符串。没有理由为什么会这样(据我所知 - 你可能不得不与Gosling或API编写者交谈);它似乎是惯例或设计决策。实际上,没有什么可以阻止实施。CharSequenceIterable

也就是说,您可以像这样循环访问字符串中的字符:

for (int i = 0; i < str.length(); i++) {
  System.out.println(str.charAt(i));
}

艺术

for(char c : str.toCharArray()) {
  System.out.println(c);
}

艺术

"Java 8".chars().forEach(System.out::println);

另请注意,您无法就地修改字符串的字符,因为字符串是不可变的。String 的可变伴随项是 StringBuilder(或较旧的 StringBuffer)。

编辑

根据对此答案的评论进行澄清。我试图解释一个可能的理由,为什么在.我并不是想说这是不可能的;确实,我认为实施是有意义的。StringCharSequenceIterable

String提供了 ,如果只是在概念上,则与 .A通常被认为是一个单一的实体,而恰恰是:一个字符序列。在字符序列(即 on )上使用迭代器是有意义的,但不能简单地对自身进行迭代。CharSequenceStringStringCharSequenceCharSequenceString

正如 Foxfire 在注释中正确指出的那样,实现了接口,因此在类型方面,a 是一个 .从语义上讲,在我看来,它们是两个独立的东西 - 我在这里可能是迂腐的,但是当我想到一个时,我通常认为它是一个碰巧由字符组成的单一实体。考虑数字序列和数字之间的差异。现在考虑字符串和字符序列之间的差异。我试图指出这种差异。StringCharSequenceStringCharSequenceString1, 2, 3, 41234abcda, b, c, d

在我看来,问为什么没有迭代器就像问为什么没有迭代器,这样你就可以迭代各个数字。StringInteger


答案 2

原因很简单:字符串类比迭代器要早得多。

显然,没有人想将接口添加到String中(这有点奇怪,因为它确实实现了基于完全相同想法的CharSequence)。

但是,它会有些不可调,因为Iterable返回一个对象。因此,它必须包装返回的每个字符。

编辑:就像比较一样:.Net确实支持在String上枚举,但是在.Net中,Iterable也适用于本机类型,因此不需要像Java中那样需要包装。