【发布时间】:2019-08-28 20:51:29
【问题描述】:
在我下面的方法中,我在Stream<Object>的.anyMatch()方法的回调中使用了net.sf.extJWNL包中的一个方法。但是,我使用的方法抛出了JWNLException。而不是当前的 try-catch 块,我想使用 throws 关键字作为 JWNLException。
Dictionary d = Dictionary.getDefaultResourceInstance();
List<POS> POSList =
new ArrayList<POS>(EnumSet.allOf(POS.class));
boolean isWord = POSList.stream().anyMatch(c -> {
try {
return d.getIndexWord(c, word) != null;
} catch (JWNLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return true;
}
});
此外,我无法将其移至单独的方法,因为我需要此方法中的局部变量 - d 和 word(参数)
【问题讨论】:
-
throws仅用于方法签名。您可能希望将 lambda 的主体移动到私有方法,但您不希望在该方法的声明中使用throws,因为这会通过强制您的 lambda 保留 try/catch 块来破坏这一点。 (此外,您不需要 ArrayList;EnumSet 有自己的stream()方法,所有 Collections 也是如此。) -
你是说我可以完全删除第 2 行并用 POS.stream() 替换 POSList.stream() 吗?这会返回一个错误
-
我是说你可以写
Collection<POS> POSList = EnumSet.allOf(POS.class);。 -
不过,您应该遵循 Java 命名约定:变量名应该用驼峰命名。
-
@Marvin 不,他们没有。 他们明确说变量名总是以小写开头,他们根本没有提及原始写作。处理此问题的普遍接受的方法是将首字母缩略词视为普通单词。
XMLHTTPParser变为XmlHttpParser和POS变为Pos(请参阅Effective Java)。对于变量名,第一个字母然后转换为小写:例如xmlHttpParser和pos.