Java 8 将 for 循环和值的总和转换为流/lambda?

enn*_*nth 3 java regex lambda functional-programming java-stream

我有一些我正在循环的字符串输入,我试图转换为 java 8 流/lambdas,但遇到了一些问题。我的样板代码如下所示:

public static int count(List<String> list) {
    String regex = "someRegexPatternHere"
    Pattern p = Pattern.compile(regex);
    int sum = 0;

    for (String val: list) {
        Matcher m = p.matcher(val);
        if (m.find()) {
            // summing logic here 
        }
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

我试图做类似的事情

list.stream()
    .filter(i -> p.matcher(i).find())
    .map(..............)
    ...
Run Code Online (Sandbox Code Playgroud)

...但无法得到总结逻辑。有人能指出我正确的方向吗?

azr*_*zro 7

您需要先应用matcherthen 过滤器find

return inputs.stream()
             .map(p::matcher)
             .filter(Matcher::find)
             .map(m -> m.group(0))
             .mapToInt(Integer::parseInt)
             .sum();
Run Code Online (Sandbox Code Playgroud)

使用 lambda 函数可以更清楚地看到它,但这是一样的

    return inputs.stream().map(input -> p.matcher(input))
                 .filter(matcher -> matcher.find())
                 .map(m -> m.group(0))
                 .mapToInt(s -> Integer.parseInt(s)).sum();
Run Code Online (Sandbox Code Playgroud)


Lou*_*man 5

这是一个棘手的问题,因为Matcher逻辑。我会这样写

list.stream()
 .map(p::matcher)
 .filter(Matcher::find)
 .mapToInt(m -> Integer.parseInt(m.group(0))
 .sum();
Run Code Online (Sandbox Code Playgroud)