在地铁相关系统开发中,一条线路往往由若干个站点按顺序组成。使用Java的ArrayList存放站点对象,再通过调用每个对象的方法拿到站名,是生成线路站点列表的常见做法。下面先建立一个基础的实体模型,再演示具体的调用方式。

一、定义站点与线路实体
我们需要两个简单的类:Station表示站点,包含站名与编号;MetroLine表示线路,内部用ArrayList管理Station对象。这样设计符合面向对象思维,也方便后续扩展换乘信息。
Station类提供getStationName方法供外部获取名称,MetroLine类提供addStation与getStationNames两种取列表的方式。代码如下:
public class Station {
private String name;
private int order;
public Station(String name, int order) {
this.name = name;
this.order = order;
}
public String getStationName() {
return name;
}
public int getOrder() {
return order;
}
}
public class MetroLine {
private String lineName;
private ArrayList<Station> stations;
public MetroLine(String lineName) {
this.lineName = lineName;
this.stations = new ArrayList<>();
}
public void addStation(Station station) {
if (station != null) {
stations.add(station);
}
}
// 传统for循环方式
public ArrayList<String> getStationNames() {
ArrayList<String> names = new ArrayList<>();
for (Station s : stations) {
if (s != null) {
names.add(s.getStationName());
}
}
return names;
}
// Stream方式
public List<String> getStationNamesByStream() {
return stations.stream()
.filter(s -> s != null)
.map(Station::getStationName)
.collect(Collectors.toList());
}
}
上述代码中,MetroLine的stations字段就是题目所说的ArrayList。通过在集合上遍历,每个Station对象都会执行getStationName方法,最终拼出整条线路的站点序列。
注意构造时使用了泛型ArrayList<Station>,编译器会强制只能放入Station类型,避免后期强制转换出错。如果外部传入null,addStation做了拦截,降低空指针风险。
二、在业务中调用对象方法获取列表
实际使用时,先创建线路,再依次加入站点,最后调用获取方法即可。下面演示完整过程,并打印结果。
public class Demo {
public static void main(String[] args) {
MetroLine line = new MetroLine("1号线");
line.addStation(new Station("西站", 1));
line.addStation(new Station("中街", 2));
line.addStation(new Station("东站", 3));
ArrayList<String> names = line.getStationNames();
System.out.println("线路站点:" + names);
List<String> streamNames = line.getStationNamesByStream();
System.out.println("Stream站点:" + streamNames);
}
}
运行后控制台会输出[西站, 中街, 东站],说明ArrayList中的对象方法已被正确调用,并汇总为对应站点列表。Stream写法更简洁,适合后续做过滤或排序。
如果线路数据来自数据库或接口,建议在getStationNames返回前用Collections.unmodifiableList包装,防止外部误改内部集合。对于超长线路,可以考虑懒加载或分页,避免一次性在内存中 holding 过多字符串。
三、常见误区与改进
新手容易直接对stations调用toString,误以为能得到站名列表,实际上打印的是Station对象地址。必须显式调用对象方法才能拿到字段。
另一个问题是把ArrayList直接作为接口返回类型,泄露了实现细节。更合理的做法是以List接口声明,并在内部使用ArrayList。这样既满足题目通过ArrayList调用的要求,又保留了替换实现的空间。
// 推荐返回List而不是ArrayList
public List<String> getStationNamesSafe() {
List<String> result = new ArrayList<>();
for (Station s : stations) {
result.add(s.getStationName());
}
return Collections.unmodifiableList(result);
}
通过以上方式,你可以在任何地铁线网场景中,利用ArrayList持有站点对象,稳定地调用其方法并生成线路站点列表,且代码具备良好的可维护性。