public ArrayList<AbstractStock> listBySymbol(String symbol) {
int i = 0;
while (i < stockData.size()) {
if (stockData.get(i).toString().contains(symbol)) {
listBySymbol.add(stockData.get(i));
System.out.println(listBySymbol.get(i).toString());
}
i++;
}
return listBySymbol;
}
我尝试了上面的方法,首先我把它放在一个for循环中并替换了一段时间,希望能出现奇迹,我尝试过使用变量来存储数据,然后将其添加到ArrayList中,将其从if 语句和使用多个循环,但似乎没有任何作用。
假设
stockData
是包含所有股票的列表,并且您只想过滤它以创建子列表,也许问题出在我们看不到的代码部分,也许 listBySymbol
列表是一个字段并且已被在其他地方进行操作,可能会使用不同的参数调用另一次listBySymbol
,从而导致空字符串。
我的第一个建议是使用并返回一个局部变量,也许使用未修改的变量,就像这样
public List<AbstractStock> listBySymbol(String symbol) {
List<AbstractStock> listBySymbol = new ArrayList<>();
int i = 0;
while (i < stockData.size()) {
if (stockData.get(i).toString().contains(symbol)) {
listBySymbol.add(stockData.get(i));
System.out.println(listBySymbol.get(i).toString());
}
i++;
}
return Collections.unmodifiableList(listBySymbol);
}
通过这种方式,即使没有
Collections.unmodifiableList(listBySymbol)
,你也非常确定没有人可以在幕后操作你的 listBySymbol 结果,如果你想优雅地做到这一点,请使用这个:
public List<AbstractStock> listBySymbol2(String symbol) {
return stockData.stream() // Use stream (java 8)
.filter(stock -> stock.toString().contains(symbol)) // filter stock per symbol
.toList(); // collect result of filter to list
}