关于java:Java开发工程师进阶篇-Java中隐藏的一些语法糖你zao吗

1次阅读

共计 2189 个字符,预计需要花费 6 分钟才能阅读完成。

作者:幻好

起源:恒生 LIGHT 云社区

语法糖(Syntactic Sugar),也称糖衣语法,出自英国计算机学家 Peter.J.Landin 创造的一个术语,指的是在计算机语言中增加的某种语法,这种语法对语言的性能并没有影响,然而更不便程序员应用。

本文通过实例代码,学习了解 Java 中的语法糖原理及用法,帮忙大家在学会如何应用 Java 语法糖的同时,理解这些语法糖背地的原理。

主动装箱与拆箱

  • 主动装箱就是 Java 主动将原始类型值转换成对应的对象,比方将 int 的变量转换成 Integer 对象,这个过程叫做装箱,反之将 Integer 对象转换成 int 类型值,这个过程叫做拆箱。
  • 如果装箱和拆箱是主动进行的非人为转换,所以就称作为主动装箱和拆箱。原始类型 byte, short, char, int, long, float, double 和 boolean 对应的封装类为 Byte, Short, Character, Integer, Long, Float, Double, Boolean。
  • 代码实例:

    • 主动装箱

      • // 编译前
        int a = 8;
        Integer b = a;
        
        // 编译后
        int a = 8;
    • 主动拆箱

      • // 编译前
        Integer a = 8;
        int b = a;
        
        // 编译后
        Integer a = Integer.valueOf(8);
  • 从反编译失去内容能够看出,在装箱的时候主动调用的是 IntegervalueOf(int)办法。而在拆箱的时候主动调用的是 IntegerintValue办法。
  • 装箱过程是通过调用包装器的 valueOf 办法实现的,而拆箱过程是通过调用包装器的 intValue 办法实现的。

数值字面量

  • 从 Java7 开始,数值字面量,不论是整数还是浮点数,都容许在数字之间插入任意多个下划线。这些下划线不会对字面量的数值产生影响,目标就是不便浏览。
  • 代码实例:

    • // 编译前
      int a = 520_1314;
      System.out.println(a);
      
      // 编译后
      int a = 5201314;
  • 从示例代码中,能够发现反编译后就是把 _ 删除了。阐明 编译器并不意识在数字字面量中的 _,在编译阶段把他去掉。
  • 在开发中,如果输出的数字值太长,能够加以宰割进步可读性。

    字符串拼接

  • 字符串 + 号拼接原理是两个字符串的拼接首先会 new 一个 StringBuilder 对象,而后别离对字符串进行 append 操作,最初调用 toString() 办法。

    • 代码实例:

      • // 编译前
        String a = "hello";
        String b = "world";
        String c = a + b;
        
        // 编译后
        String a = "hello";
        String b = "world";
  • 如果在多个字符串拼接的场景,举荐间接应用 StringBuilder 效率会更加的高,应用 + 会创立多个 StringBuilder 对象,导致效率升高。

断言

  • 在 Java 中,assert关键字是从 JAVA SE 1.4 引入的,为了防止和老版本的 Java 代码中应用了 assert 关键字导致谬误,Java 在执行的时候默认是不启动断言查看的(这个时候,所有的断言语句都将疏忽!),如果要开启断言查看,则须要用开关 -enableassertions-ea来开启。
  • 代码实例:

    • // 编译前
      int a = 5;
      int b = 6;
      assert a == b;
      System.out.println("断言正确!");
      
      // 编译后
      int a = 5;
      int b = 6;
      if(!$assertionsDisabled && a != b)
           throw new AssertionError();
  • 编译之后的代码要比咱们写的代码简单的多。所以,应用了 assert 这个语法糖咱们节俭了很多代码。
  • 其实断言的底层实现就是 if 语言,如果断言后果为 true,则什么都不做,程序继续执行,如果断言后果为 false,则程序抛出 AssertError 来打断程序的执行。
  • 断言个别在开发中应用的较少,但须要咱们理解 Java 中有这个机制。

    办法参数可变

  • 可变参数 (variable arguments) 是在 Java 1.5 中引入的一个个性,容许一个办法中传入可变数量的雷同类型参数。
  • 代码实例

    • public void varParam(String... ls) {for(int i = 0; i < ls.length; ++i) {System.out.println(ls[i]);
          }
  • 可变参数在被应用的时候,首先会创立一个数组,数组的长度就是调用该办法是传递的实参的个数,而后再把参数值全副放到这个数组当中,而后再把这个数组作为参数传递到被调用的办法中。

Lambda 表达式

  • lambda 表达式容许你通过表达式来代替性能接口。Lambda 表达式还加强了汇合库。
  • Java SE 8 增加了 2 个对汇合数据进行批量操作的包:java.util.function 包以及java.util.stream 包。
  • 流 (stream) 就如同迭代器 (iterator),但附加了许多额定的性能。总的来说,lambda 表达式和 stream 是自 Java 语言增加泛型(Generics) 和注解 (annotation) 以来最大的变动。
  • 代码实例:

    • Runnable runnable = () -> {System.out.println("l am a new thread...");
      };
* **lambda 表达式的实现其实是依赖了一些底层的 api,在编译阶段,编译器会把 lambda 表达式进行解糖,转换成调用外部 api 的形式。**

总结
正文完
 0