为何List<String>与String[] args不具备forEach方法?
嘿,我来帮你把这两个疑问掰扯清楚,这里面其实藏着几个容易搞混的知识点,咱们一个个说:
一、关于
List<String>的forEach方法 先纠正一个小误解:List<String>其实是有forEach方法的!
因为List接口继承自Collection,而Collection又继承了Iterable接口——Java 8之后,Iterable接口新增了默认方法forEach(Consumer<? super T> action),所以所有实现了Iterable的集合类(包括List、Set这些)都能直接调用forEach。举个实际运行的例子:
import java.util.List; import java.util.Arrays; public class TestListForEach { public static void main(String[] args) { List<String> myList = Arrays.asList("Java", "Python", "Go"); myList.forEach(System.out::println); // 完全可以正常执行 } }
如果你之前遇到没法调用的情况,大概率是用了Java 8之前的版本——毕竟这个方法是Java 8才引入的,老版本确实没有。
二、为什么
String[] args不能直接用forEach 这个问题的核心逻辑很简单:Java里的数组不是集合类,也没有实现Iterable接口,而咱们平时用的forEach,要么是Iterable接口给集合类提供的默认遍历方法,要么是Stream API里的流操作方法,数组两边都不沾,自然没法直接调用。
另外你提到的Serializable和forEach其实没啥关系——Serializable只是用来标记对象可以被序列化的空接口,和遍历方法的实现完全不搭边哦。
那数组要怎么用类似forEach的方式遍历呢?给你几个常用方案:
- 用增强for循环(本质还是遍历数组的语法糖):
for (String arg : args) { System.out.println(arg); }
- 像你那样转成Stream再调用
forEach:
Arrays.stream(args).forEach(System.out::println);
- 把数组转成List再用集合的
forEach:
Arrays.asList(args).forEach(System.out::println);
不过要注意,Arrays.asList()返回的是一个固定大小的列表,不能做添加、删除元素的操作,但用来遍历完全没问题。
内容的提问来源于stack exchange,提问作者Dawid
相关产品推荐
相关产品推荐

