File-settings-Editor-File and Code Templates
默认是这样的
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
public class ${NAME} {
}
我们只需修改File Header里面的内容,那么class、Interface和Enum里面的内容也会随之改变
点击includes 然后点击File Header,加入以下内容
/**
*@description
*@author ${USER}
*@date ${YEAR}-${MONTH}-${DAY} ${TIME}
*@version v1.0
**/
File-settings-Editor-Live Templates
点击+,新建一个template group
然后点击这个group,在下面点击live template创建模板
在Abbreviation里面填写需要触发快捷操作的键,这里填写m,然后在Description里面填写描述:方法注释
在Template text中填写具体的模板内容,$END$表示光标停留的位置
**
* $END$
* @author $user$
* @date $date$ $param$
* @throws Exception
* @return
**/
然后为变量关联表达式,点击 EDIT VARIABLES
在 user的Expression中填写 user()
在date的Expression中填写 date("yyyy-MM-dd HH:mm:ss")
在param的Expression中填写
groovyScript("if(\"${_1}\".length() == 2) {return '';} else {def result='\\n'; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {result+=' * @param ' + params[i] + ((i < params.size() - 1) ? '\\n' : '')}; return result}", methodParameters())
或者在DefaultValue中填写
groovyScript("def result=''; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {result+=' * @param ' + params[i] + ((i < params.size() - 1) ? '\\n':'')}; return result", methodParameters())groovyScript("def result=''; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {result+=' * @param ' + params[i] + ((i < params.size() - 1) ? '\\n':'')}; return result", methodParameters())
点击Define,选择java,选择触发快捷操作的方式,在Options的Expand width选择Space。
然后再方法上面 输入 /m 然后按空格键就可以生成注释了。
同样在新建一个template,在Abbreviation里面填写 *,然后在Description里面填写描述:字段注释,
在Template text中填写具体的模板内容
**
* $END$
**/
在定义的字段上面输入 /*就可以生成注释了
这里还是在template中新建template进行操作
$VAR1$表示生产代码后光标第一次停留的位置,$VAR2$表示第一个输入完成之后跳转的位置,依次类推
ps
/**
* $VAR1$
* */
private String $VAR2$;
$VAR3$
pi
/**
* $VAR1$
* */
private Integer $VAR2$;
$VAR3$
po
/**
* $VAR1$
* */
private Object $VAR2$;
$VAR3$
pf
/**
* $VAR1$
* */
private Float $VAR2$;
$VAR3$
pc
/**
* $VAR1$
* */
private Character $VAR2$;
$VAR3$
pd
/**
* $VAR1$
* */
private Double $VAR2$;
$VAR3$
psfs
public static final String $VAR1$ = $VAR2$;
$VAR3$
psfi
public static final Integer $VAR1$ = $VAR2$;
$VAR3$
psm
public String $END$(){
return null;
}
pom
public void $END$(){
}
pbm
public Object $END$(){
return null;
}
还可以定义许多其他类型的函数模板,读者可根据自己的时机情况自己定义即可。
File-settings-Editor-File and Code Templates
在files这一列就是我们点击新建会弹出的选项,默认并没有xml,现在我们来新建一个mybatis-cfg.xml
点击+新建,在Name输入 mybatis-cfg.xml,在Extension输入 xml
在下面的内容框中输入
最后还要点击下面的 Enable live Templates激活这个模板,然后点击OK完成
这时我们在点击File New 新建文件的选项中就有mybatis-cfg.xml这个选项了。
依据此方法我们也可以创建许多自己平时需要的模板文件。
跟上述类似,在名字中输入mapper,扩展还是输入xml,内容变成如下,
这里我使用了一个环境变量 NAMESPACE,所以在新建的时候需要我们手动输入这个命名空间的值,当然也可以留空,等新建完成之后再去修改。
步骤跟上述一样,然后再内容里面加入如下配置
在实际项目的开发过程中可以根据需要生成许多自己适用的模板,这里就不在赘述了。
在已有的template中我们可以看到有一个maven的template group,但是他默认的只有三个配置,这里我们加入一些我们平常所使用的简单配置。
新建一个live template,输入名字 prop 描述properties,然后在下面输入
UTF-8
1.8
这个是设置编码为UTF-8和java版本1.8,注意在define的时候选择Maven。
下面再来设置一个springboot的编译插件,名字输入boot,然后define这里依然选择Maven
org.springframework.boot
spring-boot-maven-plugin
这里先介绍这两个,读者可根据自己的需要定义快捷键即可。
生成指定number次数的循环
输入
50.fori
会生成
for (int i = 0; i < 50; i++) { }
同理对于数组,list等也可以用此方法
int[] a = new int[100];
输入 a.fori
会生成
for (int i = 0; i < a.length; i++) { }
生成指定number次数的逆循环,这个的功能跟fori差不多,不过是逆向遍历,
输入
50.forr
会生成
for (int i = 50; i > 0; i--) { }
对于可迭代的数组,集合等可以使用
对于上面的数组a,
输入
a.for
会生成
for (int i : a) { }
对于Map
Map map = new HashMap();
输入
map.entrySet().for
会生成
for (Map.Entry stringObjectEntry : map.entrySet()) { }
跟for的功能差不多
对于上面的数组a
输入
a.iter
会生成
for (int i : a) {}
对于一个List
List list = new ArrayList();
输入
list.iter
会生成
for (String s : list) {}
快速遍历数组
定义一个数组array,
String[] array = new String[100];
输入
itar
会生成
for (int i = 0; i < array.length; i++) { String s = array[i]; }
输入
new ArrayList
会生成
ArrayList strings = new ArrayList();
输入
public class Foo {
public Foo(int arg) {
arg.field
}
}
会生成
public class Foo {
private int foo;
public Foo(int arg) {
foo = arg;
}
}
通过在构造方法中输入成员变量.arg可以快速生成成员变量和带成员变量的构造方法。
输入
HashMap map = new HashMap();
map.nn
会生成
if (map != null) {
}
输入
public void test(){
m().try
}
public void m() throws Exception{
}
会生成
try {
m();
} catch (Exception e) {
e.printStackTrace();
}
输入
"hello".return
会生成
return "hello";
更多的代码补全方案可以查看 设置里面的Postfix Completion
这个键的功能很多,比如修复代码,自动修复错误等等。
比如在代码中输入
List list = new ArrayList();
test(list);
由于test函数不存在,那么就会提示错误,鼠标点击到test上面,按 alt+enter然后选择创建就可以自动帮我们创建一个test方法。
private void test(List list) {
}
在我们定义接口的时候也可以利用这个额快捷键,
这里新建一个UsersService的接口
public interface IUserService {
void addUser(User user);
User query(Integer id);
}
鼠标选中接口的地方,按住alt+enter,选择Implement interface
在弹出的窗口中输入名字和包名即可,默认是当前包下面。
生成的class如下
public class IUserServiceImpl implements IUserService {
@Override
public void addUser(User user) {
}
@Override
public User query(Integer id) {
return null;
}
}
alt+1显示和隐藏工程的目录结构
alt+2显示和隐藏Favorities
ctrl+alt+[ 跳转到上一个idea工程窗口
ctrl+alt+] 跳转到下一个idea工程窗口
ctrl+e 查看最近浏览过的文件,会以列表的形式展开文件列表
ctrl+shift+e 查看最近浏览过得文件并一文件+代码的形式展开。
alt+shift+c 查看最近进行过得操作,包括修改文件,新建文件,删除文件,或者对编辑器的一些设置等
默认Recently Changed Files最近修改的文件没有快捷键,下面我们为这个功能增加一个快捷键,打开设置的窗口,在搜索栏中输入recent即可查看到相应的栏目。
鼠标右键点击Add Keyboard Shortcut,然后输入自己的快捷键即可,注意不要跟其他的快捷键冲突
设置完成后
alt+e就可以查看到最近修改过得文件了。
ctrl+shift+backspace 跳转到最后一次修改过得地方
alt+← 跳转到上一个文件最后一次浏览过的地方
alt+→ 跳转到下一个文件最后一次浏览过的地方
F11 为当前光标所在的行加上书签
此时在Favorities视图的Bookmarks中就会显示刚才加入的书签。通过点击就可以跳转到刚才标记的地方
ctrl+F11 带有符号标记的书签,在弹出的窗口中选择一个数字
然后按住ctrl+对应的数字就可以跳转到书签的地方。
收藏类 鼠标定位到类名上并按住alt+shift+F
收藏方法 鼠标定位到方法名上并按住alt+shift+F
可以选择加入默认的列表也可以新建一个列表
ctrl+n
如果要查找jar包中的类,点击Project Files的下拉框选择Project and Libraries即可,
这个下拉框中有很多选项,读者不妨试一试其他的选项,比如最近查看的文件,最近修改的文件等等。
ctrl+shift+n
如果要查找jar包中的文件,点击Project Files的下拉框选择Project and Libraries即可
ctrl+alt+shift+n
如果要查找jar包中的文件,点击Project Files的下拉框选择Project and Libraries即可
到这里细心的同学可能已经发现了,这三次查找打开的窗口都是一样的只是上面的选项Classes、Files、Symbols等在切换而已,在打开这个窗口的时候,如果我们点击All,那么就会将所有的类,文件、函数等都给查找出来,
我们再点击 include non-project items那么就会将jar包中的文件函数也都列举出来。
ctrl+F 在当前页面搜索,其中Match Case是是否忽略大小写,Words是否单词,Regex是否正则表达式搜索
ctrl+shift+f 全局搜索,其中File mask可以指定搜索的文件范围。
前提条件:多行代码有相同的特点,并且需要进行类似的操作
下面演示一个将json格式的文件转换成枚举类的操作,通过这个来深刻理解列操作的好处
100: "Continue"
102: "Processing"
103: "Checkpoint
200: "OK"
201: "Created"
202: "Accept"
302: "Found"
401: "Unauthorized"
409: "Conflict"
410: "Gone"
上面是一段关于后端响应码的json字符,要将它转换成一个枚举类,传统的做法是一行一行的写,下面来演示如何利用列操作进行快速编写。
新建一个枚举类,并将这段json复制进去,
public enum Status {
100: "Continue"
102: "Processing"
103: "Checkpoint
200: "OK"
201: "Created"
202: "Accept"
302: "Found"
401: "Unauthorized"
409: "Conflict"
410: "Gone"
private int code;
Status(int code){
this.code = code;
}
}
这里需要将他变成 CONTINUE(100), 这样的格式。观察json字符即可发现他们的结构是完全一样的,所以可以很方便的进行列操作,首先选中他们都拥有的字符,我们先选择100后面的那个冒号,然后按住 ctrl+alt+shift+j,
这时所有行的:都被我们选中了,这时就可以进行列操作了。
我们选中Continue利用ctrl+shift+U将他转换成大写,然后剪切,移动光标到100的前面然后粘贴,加一个左括号,选中后面的:""删除,然后加上右括号和逗号,这时最后一行会报错,我们按住F2定位到这一行将,改成;就可以了。
shift+f6 重命名当前页面的所有变量名,包括函数名
ctrl+f6 重构函数
比如
定义了一个sayHello的函数
public void sayHello(String firstName){
System.out.println(firstName);
}
对其添加一个参数lastName,在弹出的窗口中国填入参数类型和名字即可
然后再调用的时候加上lastName参数即可。
当然这个需求也可以使用alt+enter来完成,在调用时先加上lastName参数,然后按alt+enter,选择第一行就可以了
比如有下面这段代码
public void test(){
sayHello("firstName");
sayHello("firstName");
sayHello("firstName");
sayHello("firstName");
sayHello("firstName");
}
我们要将firstName抽取出来作为一个变量,防止以后修改的时候要改多行。
ctrl+alt+v
选择Replace all
就会自动帮我们修改
String firstName = "firstName";
sayHello(firstName);
sayHello(firstName);
sayHello(firstName);
sayHello(firstName);
sayHello(firstName);
跟上面的一样只是将局部变量抽取成了成员变量,根据实际业务情况自行选择
ctrl+alt+f
private String firstName;
public void test(){
firstName = "firstName";
sayHello(firstName);
sayHello("firstName");
sayHello("firstName");
sayHello("firstName");
sayHello("firstName");
}
将参数抽取成一个静态的常量
ctrl+alt+c
public static final String FIRST_NAME = "firstName";
public void test(){
sayHello(FIRST_NAME);
sayHello(FIRST_NAME);
sayHello(FIRST_NAME);
sayHello(FIRST_NAME);
sayHello(FIRST_NAME);
}
sayHello的方法体中我们需要将其lastName也进行获取,得到一个全名,但是在我们的方法定义中,又要尽量避免使用成员变量,尽量使用局部变量,所以这里就需要将lastName抽取成局部变量
private String lastName;
public String sayHello(String firstName){
String fullName = firstName + lastName;
return fullName;
}
ctrl+alt+p
生成代码如下
public String sayHello(String firstName, String lastName){
String fullName = firstName + lastName;
return fullName;
}
public void test(){
sayHello("firstName", lastName);
sayHello("firstName", lastName);
sayHello("firstName", lastName);
sayHello("firstName", lastName);
sayHello("firstName", lastName);
}
这样方法的定义就不依赖成员变量,只是在调用的时候传入成员变量即可。
在一个方法中写了太多的代码,是非常难以阅读和维护的,这就需要对一些特定功能的代码进行抽取,将之封装成一个个的函数,每个函数都有一个单独的功能。
比如有以下代码
public void test1(){
System.out.println("validate");
System.out.println("encrypt");
System.out.println("save");
System.out.println("feedback");
}
上面的代码用一行来表示实际过程中的一段逻辑的代码,下面将这个封装成四个函数,然后再test1里面进行调用即可。
选择第一行
ctrl+alt+m
输入函数名 validate
以此方法生成其他三个函数
public void test1(){
validate("validate");
encrypt("encrypt");
save("save");
feedback("feedback");
}
private void feedback(String feedback) {
System.out.println(feedback);
}
private void save(String save) {
System.out.println(save);
}
private void encrypt(String encrypt) {
System.out.println(encrypt);
}
private void validate(String validate) {
System.out.println(validate);
}
Alibaba Java Coding Guidelines 阿里巴巴代码检查规范
Background Image Plus 代码编辑区域背景图片
CodeGlance 代码编辑区缩放图
GenerateSerialVersionUID 自动生成serialId
Grep Console 多颜色控制台
IDEA restart 重启
Key Promoter X 快捷键提示
Lomback 支持lomback
Material Theme UI 非常炫酷的主题
Maven Helper maven辅助插件
Mybatis Log Plugin mybaits日志插件
Mybatis X mybatis辅助插件
Nyan Progress Bar 多彩进度条插件
RestfulToolkit restful辅助开发工具
String Manipulation 字符串的许多快捷操作
Translation 谷歌翻译插件
比如有以下代码
for (int i = 0; i < 50; i++) {
System.out.println(i);
}
我只需要在i是10的倍数的时候查看i的值,这时就可以使用条件断点,把断点打在打印i这一行,然后鼠标选中这一行,按 ctrl+shift+F8,这时就会弹出一个输入框,在里面输入表达式即可
进入断点时,我们直接按F9,然后就只会在 0,10,20,30,40的时候停留
先来一段简单的代码
List list = new ArrayList();
Map map = new HashMap();
map.put("id",1);
list.add(1);
list.add("aa");
list.add(map);
for (Object o : list) {
System.out.println(o);
}
进入断点调试,这里将断点打在for循环这里,这时如果我们想要知道list中到底有哪些东西,或者是list的某一项是什么,就可以利用这个功能
按住 alt+F8
然后在Expression表达式中输入 list回车就可以查看到list的详细信息了
可以看到,list有三项,第一个为Integer 值为1,第二个为String值为aa第三个为HashMap size为1,在这里我们还可以输入表达式,比如list.size(),list.get(1)等等。
还是上面那个程序,我们在list.add(map)这行打上一个端点,当运行到这里时,我们点击下面端点的变量区域,点击map,按f2,然后输入null,此时map的值就为null了,然后继续运行,这时可以看到list增加了一个null。
File-settings-Code Completion,去掉Match Case前面的√