welcome to xlongwei.com

欢迎大家一起学习、交流、分享


QQ:9167702333 邮箱:admin@xlongwei.com

Enhancements in Java 增强特性


分类 Java   关键字 分享   标签 java   发布 hongwei  1456993809937
注意 转载须保留原文链接,译文链接,作者译者等信息。  
Java增强特性有些很实用,有些则很复杂。这里简要介绍一下,而复杂的新特性还会重点学习。

Enhancements in Java 5
  • Generics,泛型
    泛型替代了强制类型转换,尽管在底层实现时进行了类型擦除,但仍可以在编译时进行类型检查,并在运行时自动转换类型。
    List list = new ArrayList();
    for(int i=0; i<list.size(); i++) {
       Item item = (Item)list.get(i); //强制类型转换,很可能抛异常ClassCastException
    }

    List<Item> list = new ArrayList<Item>();
    for(int i=0; i<list.size(); i++) {
       Item item = list.get(i); //编译时检查类型,运行时自动转换
    }

  • Enhanced for loop,增强的for循环
    for(Item item : list) {  } //实现Iterable接口即可

  • Autoboxing/Unboxing,自动装拆箱
    List<Integer> list = ...;
    list.add(1);  //自动装箱
    int i = list.get(0); //自动拆箱

  • Typesafe Enums,类型安全枚举,替代魔幻数字常量(Magic Number)

  • Varargs,可变参数个数
    MessageFormat.format(String pattern, Object[] args)  //对于数组参数类型,我们需要手动构建数组参数
    MessageFormat.format(String pattern, new Object[] {"arg1", "arg2", "arg3})

    MessageFormat.format(String pattern, Object ... args)  //有了可变参数个数,就不必手动构建数组了
    MessageFormat.format(String pattern, "arg1", new Item(), 3)

  • Static Import,静态导入
    import static java.lang.Math.*;  //也可以仅导入PI常量

  • Annotation,注解
    @interface MyAnnotation{ String value() default ""; }
    没有元素时,为标记注解,例如@Deprecated
    方法元素必须是:无参数,无异常,返回值只能是基础类型、String、Class、Enum、以及对应的数组类型,可以提供默认值
    有value方法时可以直接赋值,例如@RequestParam("username"),@RequestMapping({"index", "home", ""})

Enhancements in Java 7
  • Binary Literals,二进制数值
    byte b = 0b000_10001; #以0b或0B开头
    long maxLong = 0x7fff_ffff_ffff_ffffL; //下划线可以任意分隔数字,提高代码可读性

  • Strings in switch,字符串分支判断
    switch(request.getRequestMethod()){
    case "GET": break;
    case "POST": break;
    case "HEAD": break;
    }

  • Type Inference,类型推断
    List<Item> list = new ArrayList<>(); //<>尖括号是必须的,可以从List<Item>推断出类型Item
    Map<String, List<Item>> myMap = new HashMap<>(); //多个类型时就更省事了
    class MyClass<X> { <T> MyClass(T t) { } }
    MyClass<Integer> myObject = new MyClass<>(""); //自动推断X为Integer,T为String类型

  • try-with-resources,资源释放,自动关闭java.lang.AutoCloseable对象,替代try-finally结构
    try(BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); }
    try(InputStream in=new FileInputStream(path); BufferedReader br = new BufferedReader(new InputStreamReader(in)); ) { br.readLine(); }

  • Catch Multiple Exception,多种异常捕捉
    catch (IOException|SQLException ex) { logger.log(ex); } //此时ex为隐式final,不可修改

Enhancements in Java 8
  • Lambda Expressions,拉姆达表达式,可以看作匿名方法,功能块,闭包,@FunctionalInterface,java.util.function包有很多这种接口
    <X, Y> void processElements(Iterable<X> source,Predicate<X> tester,Function <X, Y> mapper,Consumer<Y> block) {
       for (X p : source)
           if (tester.test(p)) {
               Y data = mapper.apply(p);
                block.accept(data);
           }
    }
    调用:
    class Item { String name; }
    List<Item> list = new ArrayList<>();
    processElements(items, //推断出X是Item
       item -> item.name != null,  //筛选出有name的item
       item -> item.name,  //mapper将Item映射为String,推断出Y是String
       name -> System.out.println(name)  //对name进行的操作是输出
    );

  • Inproved Type Inference,增强类型推断(根据目标期望类型推断)|
    List<String> stringList = new ArrayList<>();
    stringList.addAll(Arrays.asList()); //期望类型Collection<String>,猜出List<String>类型

  • Repeating Annotations,可重复注解
    @Repeatable(Schedules.class) //可重复注解需要使用元注解@Repeatable,重复的@Schedule注解存储为@Schedules注解
    public @interface Schedule {
      String dayOfMonth() default "first";
      String dayOfWeek() default "Mon";
      int hour() default 12;
    }
    public @interface Schedules { Schedule[] value(); }
    用法:(读取时Schedule[] schedules = clazz.getAnnotation(Schedules.class).value();)
    @Schedule(dayOfMonth="last")
    @Schedule(dayOfWeek="Fri", hour="23")
    public void doPeriodicCleanup() { ... } 

  • Method Parameter Reflection,方法参数名获取
    Method.getParameters(); //继承自java.lang.reflect.Executable.getParameters()
    Parameter.getName();  //需要开启选项javac -parameters

参考:http://tool.xlongwei.com/java8/technotes/guides/language/enhancements.html