我开始写博客文章,介绍即将发布的Java8版本中的新增功能 ,并认为我将从快速回顾一下Java7带给我们的内容开始。
Java7于2011年7月发布,被描述为“更具进化性而非革命性”。
“有一些重大的改进,但是并没有真正令人惊叹或突破性的功能。” – Oracle首席Java架构师Mark Reinhold
例如,它不包含被大肆宣传的lambda表达式。 尽管如此,它确实为Java语言带来了许多其他巧妙的补充。 您可以在http://docs.oracle.com/javase/7/docs/上找到更多内容,或者继续阅读我的摘要。
Java7的重点包括:
- 项目硬币
-
- 开关中的弦
- 资源试一试
- 多发球和更精确的重新抛出
- 钻石操作员
- 二进制整数文字
- 数字文字下划线
- 新的输入/输出功能
- Fork&Join /并发实用程序
项目币
项目代币是“零钱”的双关语,包含一些次要但有用的功能,包括:
开关中的弦
在Java 7之前的版本中,switch语句适用于原始类型或枚举类型。 Java 7引入了我们可以在Switch语句中使用的另一种类型: String
类型。 假设我们有一个根据字符串状态字段处理交易的要求。 到目前为止,我们以前都是通过使用if-else语句来实现的。
private void processTrade_UsingIfs(Trade t) {
String status = t.getStatus();
if (status.equalsIgnoreCase("New")) {
setupNewTrade(t);
} else if (status.equalsIgnoreCase("Execute")) {
executeTrade(t);
} else if (status.equalsIgnoreCase("Pending")) {
processTrade(t);
}
}
在Java7中,我们可以使用switch语句执行相同的操作:
public void processTrade_UsingSwitch(Trade t) {
String status = t.getStatus();
switch (status) {
case "New":
setupNewTrade(t);
break;
case "Execute":
executeTrade(t);
break;
case "Pending":
processTrade(t);
break;
default:
break;
}
}
尝试语句中的自动资源管理
现在,您可以在try块中声明一个将自动关闭的资源。 例如以前必须要做的事:
public void oldTry() {
FileReader fileReader = null;
BufferedReader inputStream = null;
try {
fileReader = new FileReader("java7.txt");
inputStream = new BufferedReader(fileReader);
String line = inputStream.readLine();
System.out.println(line);
} catch (IOException e) {
//typically log or rethrow
} finally {
//all resources need to be manually closed
try {
fileReader.close();
inputStream.close();
} catch (IOException e) {
//typically ignore
}
}
}
但是,现在在Java 7中,try-with-resources语句可确保在语句末尾关闭每个资源。
public void newTry() {
try (
FileReader fileReader = new FileReader("java7.txt");
BufferedReader inputStream = new BufferedReader(fileReader)
)
{
String line = inputStream.readLine();
System.out.println(line);
} catch (IOException e) {
//typically log or rethrow
}
//no finally block to close resources required
}
资源的声明出现在try关键字之后的括号内。
任何实现java.lang.AutoCloseable的对象(包括所有实现java.io.Closeable的对象)都可以用作资源。 无论try语句正常完成还是突然完成,资源都将关闭
多发球和更精确的重新抛出
多抓
public void oldMultiCatch() {
try {
methodThatThrowsThreeExceptions();
} catch (ExceptionOne e) {
// log and deal with ExceptionOne
} catch (ExceptionTwo e) {
// log and deal with ExceptionTwo
} catch (ExceptionThree e) {
// log and deal with ExceptionThree
}
}
public void newMultiCatch() {
try {
methodThatThrowsThreeExceptions();
} catch (ExceptionOne | ExceptionTwo | ExceptionThree e) {
// log and deal with all Exceptions
}
}
public void newMultiMultiCatch() {
try {
methodThatThrowsThreeExceptions();
} catch (ExceptionOne e) {
// log and deal with ExceptionOne
} catch (ExceptionTwo | ExceptionThree e) {
// log and deal with ExceptionTwo and ExceptionThree
}
}
更精确的重新抛出
Java SE 7编译器对重新抛出的异常执行更精确的分析,使您可以在方法声明的throws子句中指定比在方法主体的catch / throws中使用的更特定的异常类型。
以前,我们必须做这样的事情:
static class FirstException extends Exception { }
static class SecondException extends Exception { }
public void rethrowException_PreJava7(String exceptionName) throws Exception {
try {
if (exceptionName.equals("First")) {
throw new FirstException();
} else {
throw new SecondException();
}
} catch (Exception e) {
throw e;
}
}
注意我们如何在throws子句中声明更通用的Exception。 在Java7中,我们可以将其更改为:
public void rethrowException_PostJava7(String exceptionName) throws FirstException, SecondException {
try {
if (exceptionName.equals("First")) {
throw new FirstException();
} else {
throw new SecondException();
}
} catch (Exception e) {
throw e;
}
}
钻石操作员
Diamond运算符简化了涉及泛型的构造函数调用。 假设您要创建一个字符串ID映射来交易对象。 原来的方法是:
Map trades = new TreeMap();
但是右侧似乎有点多余。 编译器可以通过查看左侧的声明来推断类型吗? 在Java7中可以,代码变为:
Map trades = new TreeMap<>();
这是一个不错的但次要的方便–使用Guava库已经可以很好地处理它。 例如:
Map trades = Maps.newTreeMap();
二进制整数文字
如果您在代码中处理二进制文件,则很有用。 例如,您现在可以执行以下操作:
int three = 0b101;
请注意0b(或0B)前缀,以将数字标识为二进制文字。
允许在数字文字中使用下划线
我也不认为这个意义太大,但是在某些情况下可能有用。 例如:
long creditCardNumber = 1234_5678_9012_3456L;
Fork&Join /并发实用程序(JSR 166)
Fork / Join框架专注于使用计算机中可用的所有处理资源来提高应用程序的性能。 它是为可以递归分解为较小部分的工作而设计的(“分而治之”算法)。
摘要:
- Fork / Join框架:允许更轻松的Java并行编程
- 针对多处理器系统(当今几乎所有硬件)
在以下情况下使用:
- 一批工作可以分解为较小的递归调用。
- 还使用工作窃取算法,其中无工作的线程可以从其他繁忙的线程中窃取可用工作
道格·李(Doug Lea)撰写:
- oswego软件包的创建者(成为java.util.concurrent)
- 实践中Java并发的贡献者
历史简介
Java 1.4及更低版本:开发并发类非常困难-提供的低级并发原语( synchronized
, volatile
, wait()
, notify()
和notifyAll()
)难以正确使用,并且使用这些功能的错误难以实现检测和调试
Java 5:包括新的并发实用程序包
任务计划框架– Executor
框架
执行人:执行已提交的对象Runnable
任务。
ExecutorService:一种Executor
,提供提供产生Future
方法,该Future
表示(尚未完成)异步计算的结果。
Java 7:ForkJoinPool:一种新型的ExecutorService, which
使您可以更轻松地分解要同时执行的处理,并递归executes ForkJoinTasks:
类似于线程的实体,其重量比普通线程轻得多。 大量的任务和子任务可能由ForkJoinPool中的少量实际线程托管。
新的ForkJoinPool采用分而治之算法。
伪代码(摘自Doug Lea关于该主题的论文):
Result doWork(Work work) {
if (work is small) {
process the work
}
else {
split up work
invoke framework to solve both parts
}
}
摘要
- 很高兴看到Java在并发空间中的持续发展以我们在Java 5中获得的所有好处为基础
- 该框架的潜在用途是有限的,并且需要一个相当狭窄的问题范围。
新的输入/输出功能
Java7引入了一个新的文件I / O库,以增强平台独立性并增加对元数据和符号链接的支持。 新软件包是java.nio.file和java.nio.file.attribute。 主要的新类是:
- 路径 :“文件系统中路径的程序表示”。 这可能是开发人员最常使用的新类(接口)。 路径引用的文件不需要存在。 出于所有实际目的,您可以考虑用java替换java.io.File。 路径 它包括各种可用于获取有关路径的信息的方法,包括创建,转换和比较路径。
- Files :Files类为文件相关的操作提供了大量的静态方法,例如读取,写入和操作文件和目录。 Files方法对Path对象的实例起作用。
而已! Java7给我们的总结。 请参阅我的下一篇博客文章,以回顾Java8中即将推出的一些功能。
翻译自: https://www.javacodegeeks.com/2013/10/java7-a-look-back.html