我正在尝试在 Java 8 中转换下面的传统 for 循环。我尝试使用流的 forEach 迭代循环,并使用过滤器进行 contains 检查,但我无法理解如何调用
extractForDate()
方法和返回值。 请问您能帮忙解决一下吗?
for (int i = 0; i < lines.length; i++) {
if (lines[i].contains(FOR_DATE)) {
String regex = "regex expression";
forDate = extractForDate(lines[i], regex);
java.sql.Date sd = new java.sql.Date(forDate.getTime())
break;
}
}
下面是方法实现。
private static Date extractForDate(String Line, string regex) {
Matcher m = Pattern.compile(regex).matcher(line);
Date startDate = null,
if (m.find()) {
try {
startDate = new SimpleDateFormat("Mddyyyy").parse(m.group(1));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return startDate;
}
要使用 Lambda/Stream api,您需要有一个 List 实例,您可以将行转换为 ArrayList 并执行 foreach:
//...
List<String> linesList = new ArrayList<>(lines);
linesList.stream()
.filter(line -> line.contains(FOR_DATE)) //filter lines which contains FOR_DATE
.map(line -> extractForDate(line, "regex")) //returns a list of Date e.g. List<Date>
.forEach(date -> {
java.sql.Date sd = new java.sql.Date(forDate.getTime());
}
});
如果我正确理解您的代码,您只想为与您的表达式匹配的第一行创建一个日期。为此,您可以使用filter()和findFirst(),这将为您提供一个Optional,如果找到任何人,您可以使用map()来创建您的日期。我将每个步骤分成了自己的映射函数,但您当然可以将它们合并为一个。
java.sql.Date date = Arrays.stream(lines)
.filter(line -> line.contains(FOR_DATE))
.findFirst()
.map(line -> extractForDate(line, "regex expression"))
.map(Date::getTime)
.map(java.sql.Date::new)
.orElse(null);
要将传统循环转换为流,您只需将其分解为步骤并将它们转换为相应的流操作。在你的情况下:过滤、映射、收集。
您的代码可以像这样重写:
List<Date> listDates = Arrays.stream(lines)
.filter(line -> line.contains(FOR_DATE))
.map(line -> extractForDate(line, regex))
.collect(Collectors.toList());