Runnable r2 =()->System.out.println("Hello world two!");
// Lambda Sorting
Collections.sort(personList,(Person p1,Person p2)-> p1.getSurName().compareTo(p2.getSurName()))
// Lambda Listener
testButton.addActionListener(e ->System.out.println("Click Detected by Lambda Listener"));
这里无法详细展开Lambda函数这个话题——Lambda Expressions in Java 8文章提供了一个很好的切入点来更多地了解Lambda函数。
流Java 8引入了流(stream)的概念,这为Java提供了很多现代函数式语言的特性。流是一种对集合上的一系列转换延迟执行的机制。比如我们来数一下以’A’开头的名字。首先想到的方法肯定是像下面这样:
List<String> names =newLinkedList<>();
// ... add some names to the collection
long count =0;
for(String name : names){
if(name.startsWith("A"))
++count;
}
如果用流,上述就可以简化为首先将集合转换成流,然后使用函数:
List<String> names =newLinkedList<>();
// ... add some names to the collection
long count = names.stream()
.filter(name -> name.startsWith("A"))
.count();
Java同时支持用parallelStream()来进行流的并行处理。并行流允许流水线业务在独立的线程同时执行,这不仅改进了语法,同时提高了性能。在大多数情况下,你可以简单得用parallelStream()替换stream()实现并行。
Try-With-Resources结构在Java 6之前,打开一个文件然后读取内容需要通过try/finally来完成:
staticString readFirstLineFromFileWithFinallyBlock(String path)
throws IOException{
BufferedReader br =newBufferedReader(newFileReader(path));
try{
return br.readLine();
}finally{
if(br !=null) br.close();
}
}
但是readLine和close都有可能抛出异常。在这种情况下,readLine抛出的异常被忽略,我们事实上并不知道readLine执行失败。
Java 7引入了 Try-With-Resources结构来克服这种缺陷:
staticString readFirstLineFromFile(String path) throws IOException{
try(BufferedReader br =
newBufferedReader(newFileReader(path))){
return br.readLine();
}
}
上例中,无论在何种失败情况下,BufferedReader都会自动关闭文件流。你可以通过用逗号分隔的方式,用一个try语句来打开多个资源。
多重catch以往Java只允许一个catch代码块对应一个异常,这造成如下的代码冗余:
catch(IOException ex){
logger.log(ex);
throw ex;
catch(SQLException ex){
logger.log(ex);
throw ex;
}
从Java 7开始,你可以在一个代码块内捕捉多个异常,从而减少了代码冗余:
catch(IOException|SQLException ex){
logger.log(ex);
throw ex;
}
数值字面常量(Numeric Literals)数值字面常量可以添加下划线是Java语言的新特性。这允许你使用_作为大数字的视觉分隔符。下面的例子不言自明:
int thousand =1_000;
int million =1_000_000;
使用Java