使用 Java 8 Lambda \ Stream 从循环调用方法并返回值

问题描述 投票:0回答:3

我正在尝试在 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;
    }
java lambda java-8 java-stream
3个回答
3
投票

要使用 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());
    }
});

2
投票

如果我正确理解您的代码,您只想为与您的表达式匹配的第一行创建一个日期。为此,您可以使用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);

1
投票

要将传统循环转换为流,您只需将其分解为步骤并将它们转换为相应的流操作。在你的情况下:过滤、映射、收集。

您的代码可以像这样重写:

List<Date> listDates = Arrays.stream(lines)
    .filter(line -> line.contains(FOR_DATE))
    .map(line -> extractForDate(line, regex))
    .collect(Collectors.toList());
© www.soinside.com 2019 - 2024. All rights reserved.