有没有一种方法可以检查Lambda变量的显式类型?

3

请看这段 Lambda 代码:

final List<String> badKeys = pivMap.entrySet().stream()
 .filter(entry -> StringUtils.trimToNull(entry.getValue()) == null || entry.getValue().equals("{}") || entry.getValue().equals("{ }"))
 .map(Map.Entry::getKey)
 .collect(Collectors.toList());

我们希望确保Lambda变量具有明确的类型:

final List<String> badKeys = pivMap.entrySet().stream()
 .filter((final Map.Entry<String, String> entry) -> StringUtils.trimToNull(entry.getValue()) == null || entry.getValue().equals("{}") || entry.getValue().equals("{ }"))
 .map(Map.Entry::getKey)
 .collect(Collectors.toList());

有没有一种方法可以使用puppycrawl checkstyle检查上面的lambda表达式是否存在类型?在这种情况下,变量上的类型声明是:(final Map.Entry<String, String> entry)

1个回答

2
这可以通过 MatchXPathCheck 实现:
配置:

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
        "http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd">

<module name="Checker">
    <property name="charset" value="UTF-8"/>
    <property name="haltOnException" value="true"/>
    <property name="severity" value="error"/>

    <module name="TreeWalker">
        <module name="MatchXpath">
            <property name="query" value="//LAMBDA[IDENT][1]"/>
            <message key="matchxpath.match"
                     value="Lambda parameters must have type."/>
        </module>
    </module>
</module>

在这里,我们使用XPath表达式来检查IDENT是否是lambda的第一个子元素,这意味着在这种情况下它没有类型。

Java示例:

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.apache.commons.lang.StringUtils;

public class MyClass {

    void badLambda(Map<String, String> pivMap) {
        final List<String> badKeys = pivMap.entrySet().stream()
                .filter(entry -> StringUtils.trimToNull(entry.getValue()) == null // violation
                        || entry.getValue().equals("{}")
                        || entry.getValue().equals("{ }"))
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());
    }

    void goodLambda(Map<String, String> pivMap) {
        final List<String> badKeys = pivMap.entrySet().stream()
                .filter((final Map.Entry<String, String> entry) -> StringUtils.trimToNull(entry.getValue()) == null // ok
                        || entry.getValue().equals("{}")
                        || entry.getValue().equals("{ }"))
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());
    }
}

结果:


➜  src java -jar checkstyle-8.41-all.jar -c config.xml MyClass.java
Starting audit...
[ERROR] MyClass.java:11:31: Lambda parameters must have type. [MatchXpath]
Audit done.
Checkstyle ends with 1 errors.


1
Nick,你有Stellar或接受BAT代币吗?我想请你喝一杯啤酒。感谢你的精彩回答。 - Jonathan S. Fisher
1
Jonathan - 你的感激之情已足够!很高兴能帮忙 :) 以后如果有任何 Checkstyle 相关问题,请随时联系我。 - Nick Mancuso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接