10 个可提高您工作效率的最佳 IntelliJ IDEA 插件
来源:
Hackernoon
我最近询问使用 IntelliJ IDEA 的开发人员,他们最喜欢这个 IDE 的哪些插件?根据收集的回复,获得了 10 个最受欢迎的扩展程序的列表。
1. 瓦卡时间
WakaTime
允许您查看指标、分析并跟踪编程所花费的时间。有了它,您将准确地知道您花费了多少时间进行编码,因为该插件会自动跟踪您何时开始和停止打字,并提供项目、文件、分支、提交/PR、功能等的详细指标。
2.步长
该插件
有助于解决与技术债务、维护和代码重构相关的问题。步长允许您:
在代码中制作书签;
直接从编辑处跟踪技术债务;
创建待办事项;
在冲刺计划期间优先考虑技术问题;
在代码维护和重构过程中与队友协作。
3.关键推动者X
Key Promotionr X
帮助您了解 IntelliJ IDEA 中快捷键和按钮的含义。当您将鼠标悬停在 IDE 内的按钮上时,Key Promotionr X 会显示一个键盘快捷键,您可以使用该快捷键,而无需单击鼠标。
4.IntelliJ 的 ZIO
ZIO
将为您提供 Scala ZIO 生态系统的建议、重构和其他改进。该插件通过以下功能扩展了 ZIO 库:
重构和建议;
支持 zio 宏(例如,@accessible);
内置测试运行。
5.Protobuf
基于 IntelliJ 的 IDE 的
Protobuf 语言
插件提供对 Protobuf 语言的支持。Protobuf 有助于语法突出显示、从库和 SDK 导入文件、导航、代码折叠、语义分析和快速文档。
6.SonarLint
SonarLint
允许您在代码问题发生之前修复它们。作为拼写检查器,SonarLint 在您编写代码时会突出显示错误和安全漏洞,并提供有关如何修复它们的明确说明,以便您可以在提交代码之前修复它们。VS Code 中的 SonarLint 支持 Java、JavaScript、TypeScript、Python、HTML 和 PHP 中的代码分析。
7.ESLint
ESLint
支持将 eslint 警告显示为 IntelliJ 检查,帮助执行多个规则的快速修复,支持自定义 eslint 规则以及 eslint 配置注释和补全。
8. 更漂亮
Prettier
扩展可以帮助您的代码看起来更好并且更加一致。它通过分析代码并根据其规则和最大行长度重写代码来确保一致的风格。
9.短尾矮袋鼠
Quokka.js
是一款用于 JavaScript/TypeScript 快速原型开发的开发人员生产力工具。在 IDE 中,它会在您键入时更新代码旁边的执行时间指标。这极大地加快了 JavaScript/TypeScript 的原型设计、训练和测试速度。
10. 王牌跳跃
AceJump
允许您快速将光标移动到编辑器中可见的任何位置。只需按“CRTL+;”,输入一个字符,然后输入 Ace Jump 对应的字符。如果屏幕上没有找到匹配项,AceJump 将继续查找它能找到的下一个匹配项。
使用函数式接口处理 Java Streams 中的异常
来源:
Dev.to
我最近查看了一些代码,发现了这样的东西:
subject.getIdentities().forEach(i -> {
try {
caseService.updateDocument(i.getCase());
} catch (Exception e) {
log.error(e);
});
由于我是 lambda 表达式的忠实粉丝并且喜欢简洁,因此上面的代码对我来说似乎有点简洁并且有点令人困惑。要清除它,您应该使用函数式接口。为此我们需要什么?我们知道
forEach
期望消费者输入。如果我们可以将异常处理逻辑包装在 Consumer 中,那么我们就可以在 forEach 中使用该逻辑。forEach 内部的主要逻辑如下:
i -> caseService.updateDocument(i.getCase());
我们知道输入和返回类型,并且可以创建一个其方法抛出异常的函数式接口。
@FunctionalInterface
public interface ThrowingFunction<Identity, UpdateResponse> {
UpdateResponse apply(Identity i) throws Exception;
}
我们可以使用泛型使代码更加方便。
@FunctionalInterface
public interface ThrowingFunction<T, R> {
R apply(T t) throws Exception;
}
创建接口后,原始逻辑就可以输入:
ThrowingFunction<Identity, UpdateResponse> tf = i -> caseService.updateDocument(i.getCase());
现在我们有了逻辑的函数式接口,我们可以将其作为参数传递给处理异常并返回可在 forEach 中使用的 Consumer 的方法。
private static <T, R> Consumer<T> wrap(ThrowingFunction<T, R> f) {
return t -> {
try {
f.apply(t);
} catch (Exception e) {
throw new RuntimeException(e);
}
看起来有点奇怪,但本质上,wrap 方法接受 ThrowingFunction 作为输入,并处理函数的执行或捕获并抛出 Consumer 中的异常。现在我们可以将任何使用的可能抛出异常的逻辑包装在 forEach 中。它看起来像这样:
ThrowingFunction<Identity, UpdateResponse> tf = i -> caseService.updateDocument(i.getCase()):
Consumer<Identity> p = wrap(tf);
subject.getIdentities().forEach(p);
或者,如果您更喜欢一行:
subject.getIdentities().forEach(wrap(i -> caseService.updateDocument(i.getCase())));
同意这要好得多!您可以实现类似的东西来处理不同类型的功能接口。例如,
Map操作仅采用
Function
作为输入。您可以使用返回函数的方法,而不是返回 Consumer 的包装器方法。这只是处理线程中异常的一种方法。我应该提到的是,有些
库
可以为您执行此操作。您还可以使用 monad 来处理成功或失败,但这超出了本文的范围。
CodeGym 是一个从零开始学习 Java 语言编程的在线课程。本课程是初学者掌握 Java 语言的绝佳方式。它包含 1200 多个可即时验证的任务,以及基本范围内的 Java 基础理论。为了帮助你在教育上取得成功,我们实现了一组激励功能:小测验、编码项目以及有关高效学习和 Java 语言开发人员职业方面的内容。