Java流中如何获取元素名称作为字符串并生成指定格式结果
问题
我有一个文件名列表[1999-01-01, 1999-06-01, 1999-11-01],可通过getRatesFiles方法获取该格式列表。我希望通过流处理该列表,利用每个元素的名称调用getRateAtDate方法读取对应文件的数据,最终生成如下格式的结果:
"Date: 1999-01-01 Rate: 0.602941", "Date: 1999-06-01 Rate: 0.621195", "Date: 1999-11-01 Rate: 0.60824"
现有代码如下:
public Double getRateAtDate(String symbol, String date) { RateListing rateListing = rlrReader.readRatesAtDate(date); throwExceptionIfSymbolNotFound(rateListing, symbol); return rateListing.rates().get(symbol); } public String[] getRatesForYear(String symbol, String year) { List<String> listOfYearFiles = rlrReader.getRatesFiles(); List<String> stringsList = listOfYearFiles.stream() .filter(string -> string.startsWith(year)) .sorted() .map(string -> getRateAtDate(symbol, ??) .map(string -> "Date: " + string) .toList(); }
请问如何在流的map操作中传入元素名称到getRateAtDate方法,并生成指定的字符串格式?
解决方案
要实现需求,需要在流操作中保留日期字符串的上下文,同时获取对应汇率值并拼接成目标格式,具体修正如下:
- 合并map操作:原代码连续的两个
map会丢失日期信息(第一个map将日期转为Double类型汇率),需在单个map中同时处理日期和汇率。 - 传入日期参数:在Lambda表达式中直接将当前流元素(日期字符串)作为第二个参数传入
getRateAtDate。 - 拼接目标字符串:获取汇率后,按指定格式拼接字符串。
修正后的完整代码:
public Double getRateAtDate(String symbol, String date) { RateListing rateListing = rlrReader.readRatesAtDate(date); throwExceptionIfSymbolNotFound(rateListing, symbol); return rateListing.rates().get(symbol); } public String[] getRatesForYear(String symbol, String year) { List<String> listOfYearFiles = rlrReader.getRatesFiles(); List<String> stringsList = listOfYearFiles.stream() .filter(dateStr -> dateStr.startsWith(year)) .sorted() .map(dateStr -> { Double rate = getRateAtDate(symbol, dateStr); return String.format("Date: %s Rate: %s", dateStr, rate); }) .toList(); // 将List转换为String数组,满足方法返回值要求 return stringsList.toArray(new String[0]); }
关键说明
- 用
dateStr作为变量名替代string,提升代码语义可读性。 - 使用
String.format拼接字符串,比直接用+更简洁易维护。 - 补充了List转String数组的逻辑,确保方法返回值符合定义。
内容的提问来源于stack exchange,提问作者santa_cloudy
相关产品推荐
相关产品推荐

