JavaSE核心API--包装类与Lambda表达式

java.lang.Integer等

1)理论讲解:自动拆装箱

JDK5发布时,推出了一个特性:自动拆装箱
允许编译器在编译源代码时将基本类型与引用类型之间互相
赋值时补全代码自动进行转换

代码演示:

    /*
     * 触发了编译器自动拆箱特性:
     * 编译器会将下面的代码改为
     * int d = new Integer(1).intValue();
     */
    int d = new Integer(1);
    /*
     * 触发了自动装箱特性:
     * 编译器会改为:
     * Integer i = Integer.valueOf(d);
     */
    Integer i = d;

2)理论讲解:包装类

包装类
包装类是为了解决基本类型不能直接参与面向对象开发的问题

其中6个数字类型的包装类都继承自java.lang.Number,其余两个直接继承自Object
Number是一个抽象类,定义了数字类型包装类共有的行为:
允许在数字类型之间互相转换

代码演示:

        int d=128;
        //将基本类型转换为包装类,不建议自己去new
//      Integer i1=new Integer(d);
//      Integer i2=new Integer(d);

        //从基本类型转换为包装类建议使用valueOf方法:
        Integer i1=Integer.valueOf(d);
        Integer i2=Integer.valueOf(d);

        System.out.println(i1==i2);//在byte范围内好使,超过127就不好使了
        System.out.println(i1.equals(i2));
        /*
         * 将包装类转换为基本类型
         */
        int in=i1.intValue();
        System.out.println(in);

        double dd=i1.doubleValue();
        System.out.println(dd);

        //可能发生溢出
        byte b=i1.byteValue();
        System.out.println(b);

        /*
         * 数字类型的包装类都支持两个常量:
         * MAX_VALUE,MIN_VALUE
         * 用于表示其对应的基本类型数据的取值范围
         */
        //int最大值与最小值?

        int imax=Integer.MAX_VALUE;
        int imin=Integer.MIN_VALUE;
        long lmax=Long.MAX_VALUE;

        System.out.println(imax);
        System.out.println(imin);
        System.out.println(lmax);

3)理论讲解:类型转换

包装类提供了一个静态方法:parseXXX(String str)
可以将给定的字符串转换为对应的基本类型,前提是该字符串内容要正确的描述基本类型可以保存的值

代码演示:

    String str="123";
    int d=Integer.parseInt(str);//如果此时str传的不是整数类型,则会抛出数字格式异常
    System.out.println(d);

    double dou=Double.parseDouble(str);
    System.out.println(dou);

    /**
     * JDK1.5发布时,推出了一个特性:自动拆装箱(是编译器认可,而不是jvm虚拟机认可)
     * 允许编译器在编译源代码时将基本类型与引用类型之间互相赋值补全代码自动进行转换
     */
    /*
     * 引用类型要赋值给基本类型
     * 触发了编译器自动拆箱特性:
     * 编译器会将下面的代码改为:
     * int n=new Integer(1).intValue();
     */
    int n=new Integer(1);//类型不匹配,要改成int n=new Integer(1).intValue();
    /*
     * 触发了自动装箱特性:
     * 编译器会改为:
     * Integer i=valueOf(n);
     */
    Integer i=n;//类型不匹配,要改成Integer i=valueOf(n);

扩展:lambda表达式

1)理论讲解:lambda表达式

lambda表达式 JDK8之后推出的新特性

lambda可以用更简洁的语法定义匿名内部类 语法: ([实参列表])->{ 方法体 }

注意:使用lambda表达式创建匿名内部类时,要求实现的接口必须只能有一个方法,否则不可以使用

代码演示:

//      Runnable r=new Runnable() {
//          @Override
//          public void run() {
//              System.out.println("helloworld");
//          }
//      };

//      Runnable r=()->{
//          System.out.println("helloworld");
//      };

//      Runnable r=new Runnable() {
//          @Override
//          public void run() {
//              System.out.println("helloworld");
//          }
//      };
//      
//      Thread t=new Thread(r);
//      t.start();

    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("helloworld");
        }
    }).start();

    /*
     * 如果方法体中只有一句代码,那么"{}"可以省略不写
     */
//      Runnable r=()->System.out.println("helloworld");

2)理论讲解:有参方法的lambda写法

代码演示:

    List<String> list = new ArrayList<>();
    list.add("马冬梅");
    list.add("小明");
    list.add("王老师");
    System.out.println(list);

    Comparator<String> com = new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.length() - o2.length();
        }
    };
    Collections.sort(list, com);
    System.out.println(list);

    /*
     * lambada在忽略"{}"的同时,若有return关键字的使用时,要连同return关键字一同忽略
     */
    Collections.sort(list, (o1, o2) -> o2.length() - o1.length());
    System.out.println(list);