1.jshell
(1) 简介
JShell(Java Shell)工具是 JDK1.9 出现的工具, JShell 是一个用于学习 Java 编程语言和 Java 代码原型的交互式工具。JShell 是交互式 REPL(Read-Evaluate-Print Loop,读取-求值-输出 循环)工具。它在输入时评估声明,语句和表达式,并立即显示结果。
JShell 可帮助您在开发程序时尝试代码并轻松探索选项。您可以测试单个语句,尝试不同的方法变体,并在 JShell 会话中试验不熟悉的API。JShell 不替换 IDE。在开发程序时,将代码粘贴到 JShell 中进行试用,然后将 JShell 中的工作代码粘贴到程序编辑器或 IDE 中。
(2) 常用jshell命令
-
命令行中通过指令jshell,调取jshell工具
-
常用指令
指令 描述 /help 获取有关使用jshell工具的信息 /help intro jshell工具的简介 /list 列出当前session里所有的有效片段 /vars 查看当前session下所有创建过的变量 /methods 查看当前session下所有创建过的方法 /imports 列出导入的包 /history 键入的内容的历史记录 /edit 使用外部编辑器来编写java代码 /exit 退出jshell工具 代码演示:
jshell> /list 1 : int x = 8,y = 10; 2 : int x = 8,y = 10; 3 : System.out.println(x + y); 4 : List<Integer> list = Arrays.asList(1,2,3,4,5,6,7); 5 : int sum = list.stream().reduce(Integer :: sum).get(); 6 : int add(int x,int y) { return x + y; } jshell> /edit add jshell> /edit jshell> /vars | int x = 8 | int y = 10 | List<Integer> list = [1, 2, 3, 4, 5, 6, 7] | int sum = 28 jshell> /imports | import java.io.* | import java.math.* | import java.net.* | import java.nio.file.* | import java.util.* | import java.util.concurrent.* | import java.util.function.* | import java.util.prefs.* | import java.util.regex.* | import java.util.stream.*
2.异常处理值try-catch资源关闭
(1) 介绍
JDK7的新特性
在try的后面可以增加一个(),在括号中可以声明流对象并初始化。try中的代码执行完毕,会自动把流对象释放,就不用写finally了。
格式:
try(资源对象的声明和初始化){
业务逻辑代码,可能会产生异常
}catch(异常类型1 e){
处理异常代码
}catch(异常类型2 e){
处理异常代码
}
(2) 说明
- 在try()中声明的资源,无论是否方生异常,无论是否处理异常,都会自动关闭资源对象,不用手动关闭了。
- 这些资源实现类必须实现AutoCloseable或Closeable接口,实现其中的close()方法。Closeable是AutoCloseable的子接口。Java7几乎把所有的“资源类”(包括文件IO的各种类、JDBC编程的Connection、Statement等接口…)都进行了改写,改写后资源类都实现了AutoCloseable或Closeable接口,并实现了close()方法。
代码演示:
@Test
public void test1(){
try(FileWriter fw = new FileWriter("test.txt");
BufferedWriter bw = new BufferedWriter(fw);
){
bw.write("I am good at Java computing!");
}catch (Exception e){
e.printStackTrace();
}
}
3.var
(1)介绍
这是JDK10的新特性,用来声明一个已经知道类型的变量
例如:
@Test
public void test1(){
List<User> users = UserData.getUsers();
for(var user : users){
System.out.println(user);
}
}
(2) 不能用var的情况
- 声明一个成员变量
- 声明一个数组变量,并为数组静态初始化(省略new的情况下)
- 方法的返回值类型
- 方法的参数类型
- 没有初始化的方法内的局部变量声明
- 作为catch块中异常类型
- Lambda表达式中函数式接口的类型
- 方法引用中函数式接口的类型
4.Instanceof的模式匹配
在判断对象类型时,如果匹配,就将其转换成对应类型
例如:
public boolean equals(Object o) {
if(o instanceof User u){ //这一句包括了强转: User u = (User)o;
return u.getId() == this.getId() && u.getName() == this.getName();
}
return false;
}
5.switch
- 使用->可以代替break
- 使用yield可以有返回值
代码演示:
public static void main(String[] args){
System.out.println("下"); Scanner input = new Scanner(System.in);
int num = input.nextInt();
char flag = switch (num){
case 1 -> {
yield '壹';
}
case 2 -> {
yield '贰';
}
case 3 -> {
yield '叁';
}
case 4 -> {
yield '肆';
}
case 5 -> {
yield '伍';
}
default -> {
yield '无';
}
};
System.out.println(flag);
}