Java 7的新特性

96

Java 7将实现哪些新功能?他们现在正在做什么?


11
语言变更的完整最终列表。 - badp
8个回答

215

Java SE 7 JDK 7发布说明中的功能和增强特性

以下是来自OpenJDK 7功能页面的Java 7新特性摘要:

vm  JSR 292:支持动态类型语言(InvokeDynamic)
        严格的类文件检查
lang    JSR 334:小语言增强(Project Coin)
core    升级类加载器架构
        关闭URLClassLoader的方法
        并发和集合更新(jsr166y)
i18n    Unicode 6.0
        区域设置增强
        用户区域设置和用户界面区域设置分离
ionet   JSR 203:针对Java平台的更多新I/O API(NIO.2)
        zip/jar档案的NIO.2文件系统提供程序
        SCTP(流控制传输协议)
        SDP(套接字直接协议)
        使用Windows Vista IPv6栈
        TLS 1.2
sec     椭圆曲线密码术(ECC)
jdbc    JDBC 4.1
client  用于Java 2D的XRender流水线
        为6u10图形功能创建新的平台API
        Swing的Nimbus外观
        Swing JLayer组件
        Gervill音频合成器 [NEW]
web     更新XML堆栈
mgmt    增强的MBeans [UPDATED]

Java 1.7新功能的代码示例

Try-with-resources语句

这个:

BufferedReader br = new BufferedReader(new FileReader(path));
try {
   return br.readLine();
} finally {
   br.close();
}

变成:

try (BufferedReader br = new BufferedReader(new FileReader(path)) {
   return br.readLine();
}

您可以声明多个要关闭的资源:

try (
   InputStream in = new FileInputStream(src);
   OutputStream out = new FileOutputStream(dest))
{
 // code
}

数字字面量中的下划线

int one_million = 1_000_000;

switch中的字符串

String s = ...
switch(s) {
 case "quux":
    processQuux(s);
    // fall-through

  case "foo":
  case "bar":
    processFooOrBar(s);
    break;

  case "baz":
     processBaz(s);
    // fall-through

  default:
    processDefault(s);
    break;
}

二进制字面量

int binary = 0b1001_1001;

改进的泛型实例创建类型推断

Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

变成:

Map<String, List<String>> anagrams = new HashMap<>();

多重异常捕获

以下是示例:

} catch (FirstException ex) {
     logger.error(ex);
     throw ex;
} catch (SecondException ex) {
     logger.error(ex);
     throw ex;
}

变成:

} catch (FirstException | SecondException ex) {
     logger.error(ex);
    throw ex;
}

SafeVarargs

this:

@SuppressWarnings({"unchecked", "varargs"})
public static void printAll(List<String>... lists){
    for(List<String> list : lists){
        System.out.println(list);
    }
}

变成:

@SafeVarargs
public static void printAll(List<String>... lists){
    for(List<String> list : lists){
        System.out.println(list);
    }
}

4
+1 用于难以找到的代码示例。你能添加更多吗? - Zasz
3
改进后的类型推断似乎是从C#复制过来的悲伤副本,其中有一个奇怪的变化,在引用被赋予类型的同时,对象却没有??真是太可笑了! - Zasz
1
@Zasz,是的,当然,它正在不断改进中。 - didxga
那么问题是针对 OP 的,你的意见是什么?这些增强只是在生产力方面,还是它们真的可以提高程序的性能?如果没有字节码更改,那么新的语言增强是否可以与标记为 1.5 的字节码一起使用? - Dmitriy R
虽然不是语言改进,但有了新的Objects类,其中包含静态方法来避免检查空引用。例如:if (obj != null && obj.equals(anotherObj))变成了if (Objects.equals(obj, anotherObj)) - Carcamano
非常感谢你的努力,+1。 - Nelssen

13

Java标准版(JSE 7)的新功能

  1. 使用JLayer类装饰组件:

    JLayer类是Swing组件的一种灵活而强大的装饰器。Java SE 7中的JLayer类在精神上类似于java.net上的JxLayer项目。JLayer类最初基于JXLayer项目,但其API单独演变。

  2. switch语句中的字符串:

    在JDK 7中,我们可以在switch语句的表达式中使用String对象。对于使用String对象的switch语句,Java编译器生成的字节码通常比链式if-then-else语句更有效率。

  3. 泛型实例的类型推断:

    我们可以使用一个空的类型参数集(<>)替换调用泛型类构造函数所需的类型参数,只要编译器可以从上下文推断出类型参数即可。这一对尖括号在非正式场合被称为diamond。 Java SE 7支持有限的泛型实例创建类型推断;只有当构造函数的参数化类型在上下文中明显时才能使用类型推断。例如,以下示例不会编译:

    List<String> l = new ArrayList<>();
    l.add("A");
    l.addAll(new ArrayList<>());
    

    相比之下,以下示例可以编译:

    List<? extends String> list2 = new ArrayList<>();
    l.addAll(list2);
    
  4. 捕获多个异常类型并使用改进的类型检查重新抛出异常:

    在Java SE 7及更高版本中,单个catch块可以处理多种类型的异常。此功能可减少代码重复。考虑以下代码,其中每个catch块都包含重复的代码:

  5. catch (IOException e) {
        logger.log(e);
        throw e;
    }
    catch (SQLException e) {
        logger.log(e);
        throw e;
    }
    

    在Java SE 7之前的版本中,由于变量e有不同的类型,因此很难创建一个通用方法来消除重复的代码。 以下示例在Java SE 7及更高版本中有效地消除了重复的代码:

    catch (IOException|SQLException e) {
        logger.log(e);
        throw e;
    }
    
  6. catch子句指定块可以处理的异常类型,每个异常类型用竖杠(|)分隔。

  7. java.nio.file包

    java.nio.file包及其相关包java.nio.file.attribute为文件I/O和访问文件系统提供全面支持。JDK 7中还提供了一个zip文件系统提供程序。

  8. 来源:http://ohmjavaclasses.blogspot.com/



3

除了John Skeet所说的,这里有一个Java 7项目概述。其中包括功能列表和描述。

注意:JDK 7于2011年7月28日发布,因此您现在应该转到官方的Java SE网站


FYI,这是一份不错的演示文稿,但有些过时了。 - Alex Miller
当我尝试打开这个链接时,我收到了一个希伯来语的错误页面 - 是否有更更新版本的副本? - Simon Nickerson

1
语言变化:
-Project Coin (small changes)
-switch on Strings
-try-with-resources
-diamond operator

图书馆变更:
-new abstracted file-system API (NIO.2) (with support for virtual filesystems)
-improved concurrency libraries
-elliptic curve encryption
-more incremental upgrades

平台变更:
-support for dynamic languages

以下是JAVA 7新添加功能的解释链接,每个功能都有可能的小例子,解释非常清晰:

http://radar.oreilly.com/2011/09/java7-features.html


0
使用 Diamond(<>)运算符进行泛型实例创建
Map<String, List<Trade>> trades = new TreeMap <> ();

在 switch 语句中使用字符串。
String status=  “something”;
   switch(statue){
     case1: 
     case2: 
     default:
    }

数字字面量中使用下划线:
int val = 12_15; long phoneNo = 01917_999_720L;
使用“|”运算符在单个catch语句中抛出多个异常:
catch(IOException | NullPointerException ex){
          ex.printStackTrace();   
    }

不需要关闭资源,因为Java 7提供了try-with-resources语句。
try(FileOutputStream fos = new FileOutputStream("movies.txt");
      DataOutputStream dos = new DataOutputStream(fos)) {
              dos.writeUTF("Java 7 Block Buster");
  } catch(IOException e) {
        // log the exception
  }

带有前缀“0b”或“0B”的二进制字面量

0

我认为在Java 7中,ForkJoinPool和与Executor Framework相关的增强功能是一个重要的补充。


-2

以下列表包含Java SE 7中增强页面的链接。

Swing
IO and New IO
Networking
Security
Concurrency Utilities
Rich Internet Applications (RIA)/Deployment
    Requesting and Customizing Applet Decoration in Dragg able Applets
    Embedding JNLP File in Applet Tag
    Deploying without Codebase
    Handling Applet Initialization Status with Event Handlers
Java 2D
Java XML – JAXP, JAXB, and JAX-WS
Internationalization
java.lang Package
    Multithreaded Custom Class Loaders in Java SE 7
Java Programming Language
    Binary Literals
    Strings in switch Statements
    The try-with-resources Statement
    Catching Multiple Exception Types and Rethrowing Exceptions with Improved Type Checking
    Underscores in Numeric Literals
    Type Inference for Generic Instance Creation
    Improved Compiler Warnings and Errors When Using Non-Reifiable Formal Parameters with Varargs Methods
Java Virtual Machine (JVM)
    Java Virtual Machine Support for Non-Java Languages
    Garbage-First Collector
    Java HotSpot Virtual Machine Performance Enhancements
JDBC

参考资料1 参考资料2


1
你应该提供更多的简短描述或示例,而不是那个列表,因为我们也可以在Java官方页面上找到。 - Ken Block

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接