当前位置: 首页 > 知识库问答 >
问题:

SonarLint:让这个匿名的内部类成为lambda

洪浩
2023-03-14

以下代码收到Sonarint的通知:

handler.setFileNameGenerator((new FileNameGenerator() {
    @Override
    public String generateFileName(Message<?> message) {
        if (message.getPayload() instanceof File) {
            return ((File) message.getPayload()).getName();
        } else {
            throw new IllegalArgumentException("File expected as payload.");
        }
    }
}));

我尝试了以下内容,但在抛出新的IllegalArgumentException时遇到了问题:

handler.setFileNameGenerator(message -> 
       (message.getPayload() instanceof File) ? 
       ((File) message.getPayload()).getName() : 
       throw new IllegalArgumentException("File expected as payload."));

你能建议一下吗?

共有1个答案

王成化
2023-03-14

您使用的是条件表达式:不能将throw语句作为条件表达式的一部分。这是第一个问题。

第二个挑战是,您需要引发异常,因此当前使用条件表达式的表达式无法工作,除非您使用块:

handler.setFileNameGenerator(message -> {
    if (message.getPayload() instanceof File) {
        return ((File) message.getPayload()).getName();
    } else {
        throw new IllegalArgumentException("File expected as payload.");
    }
});

看起来更像是匿名类的复制/粘贴。。。

或者,您可以使用选件进行清理:

handler.setFileNameGenerator(message -> Optional.of(message.getPayload())
        .filter(p -> p instanceof File)
        .map(f -> (File) f)
        .map(File::getName)
        .orElseThrow(() -> new IllegalArgumentException("File expected as payload.")));
 类似资料:
  • 下面的代码可以工作,但我收到了SonarLint的通知,因为我在流中使用了匿名类而不是lambda表达式,我不知道如何改进下面的代码来避免通知: 代码解释:我使用java.util的属性类,不幸的是,属性的返回

  • 我正在运行SonarLint 3.4和Oracle JDK 8。SonarLint给我这个错误: 只包含一个方法的匿名内部类应成为lambdas(squid:S1604) 我无法控制的界面设置如下: 这是生成错误的代码: 由于“接口”不是功能接口,我看不到用lambda替换它的方法。这是SonarLint中的错误还是我错过了什么?

  • 把一个匿名类转成内部类 操作步骤: 菜单栏: Refactor —> Convert Anonymous to Inner...

  • 问题内容: 这是一个例子 这仅仅是匿名内部类的变体,还是完全其他? 问题答案: 是的,这是一个匿名内部类

  • 问题内容: 除了使用反射来访问匿名内部类的成员之外,还有其他方法吗? 问题答案: 匿名内部类具有类型,但没有名称。 您可以访问未由命名超类型定义的字段。但是,一旦分配给命名类型变量,该接口就会丢失。 显然,您可以从内部类本身内部访问字段。添加代码的一种方法是通过实例初始化程序: 匿名内部类表达式返回的值具有匿名类型,因此您有机会在类本身之外使用它: 您也可以通过声明类似于以下内容的方法传递它:

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除