以下代码收到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."));
你能建议一下吗?
您使用的是条件表达式:不能将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如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除