欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK8新特性

程序员文章站 2024-03-23 14:21:10
...

1 可变参数

//可变参数
    public static  void method1(int ... num){
        //[[email protected]
        System.out.println(num);
        for (int i : num) {
            System.out.println(i);
        }
    }
    //可变参数和其他类型参数的传参
    public static  void method2(String str,int ... num){
        //[[email protected]
        System.out.println(num);
        for (int i : num) {
            System.out.println(i);
        }
        System.out.println(str);
    }

2.增强for循环

 //增强for循环
    public static void method3(int ...num){
        //在增强for循环中数据的类型必须是集合或者数组中元素的数据类型。
        for (int i : num) {
            System.out.println(i);
        }
    }

3.lambda 表达式

lambda 表达式的形式
<函数式接口> <变量名称>=(参数列表)->{
方法体:
}

lambda 表达式的特点

  • 函数式接口是接口中只有一个抽象方法的接口。
  • = 右边的类型会根据左边的函数式接口类型自动判断
  • 如果参数列表为空,只保留()
  • 如果参数只有一个,可以省略数据类型,保留变量名称即可。
  • 如果是想语句只有一句,且没有返回值则可以省略{},如果有返回值,执行语句只有一句想省略{} 则雅瑶省略return.
  • lambda 不会生成一个单独的内部类文件。
public interface LambdaDemo1 {
    void eat(String str);
}

 //lambda 表达式
        LambdaDemo1  lambdaDemo1 = (String str)->{
            System.out.println("eat foods!!!!" + str);
        };

        LambdaDemo1  lambdaDemo3 = (String str)->

            System.out.println("eat foods!!!!" + str);
        //lambda 简化以后
        LambdaDemo1  lambdaDemo4 = str ->
            System.out.println("eat foods!!!!" + str);

        lambdaDemo1.eat("World");
        lambdaDemo3.eat("World");
        lambdaDemo4.eat("World");
public interface Demo1 {
    //默认的方法 是允许有方法体的,并且被所有实现类的对象直接使用。
    public default  void hello(){
        System.out.println("HelloWolrd");
    };

        public void  eat();
}

public class Demo1Impl implements  Demo1 {
    @Override
    public void eat() {
        System.out.println("Demo01Impl eat foods!!!");
    }
}

 public static void method5(){
       Demo1Impl  demo1  = new Demo1Impl();
                demo1.hello();
                demo1.eat();
    }


// 带返回值的方法
    public interface LambdaDemo2 {
   int  sum(int  a,int b);
}

//lambda 表达式
 public  static  void test3(){
        LambdaDemo2  lambdaDemo2 = (int a,int b)->{return a+b;};
        System.out.println(lambdaDemo2.sum(10,20));
        //省略{} 和 return
        LambdaDemo2  lambdaDemo3 = (int a,int b)-> a+b;;
        System.out.println(lambdaDemo3.sum(100,200));

        // 省略数据类型
        LambdaDemo2  lambdaDemo4 = (a,b)-> a+b;;
        System.out.println(lambdaDemo4.sum(1000,2000));

    }

4集合Stream

public static void method4(){
        ArrayList<String>  list = new ArrayList<>();
            list.add("String");
            list.add("Hello");
            list.add("Javav");
            list.add("World");
            list.add("c++");
            list.add("lambda");
            list.add("switch");
            list.add("small");
            list.add("shell");
            //Stream  流
        //Stream<String> stringStream = list.parallelStream();
        //计算流中元素的个数
        //System.out.println(stringStream.count());
        //lambda 表达式结合集合流
        // 从容器中获取最大值
       // System.out.println(stringStream.max((a,b)->{return  a.compareTo(b) ;}).get());
        //System.out.println(stringStream.min((a,b)->{return  a.compareTo(b) ;}).get());

        System.out.println(list.parallelStream().count());
        System.out.println(list.parallelStream().max((a,b)->a.compareTo(b)).get());
        System.out.println("------");
        //过滤集合中以s开头的元素
        Object[] s = list.stream()
        //过滤值不为空
                .filter(num -> num != null)
                //过滤值以s开头
                .filter(str -> str.startsWith("s"))
                //转换为数组
                .toArray();
        for (Object o : s) {
            System.out.println(o);
        }
    }


     public static  void method7(){
        ArrayList<Integer> list = new ArrayList<>();
                    list.add(23);
                    list.add(44);
                    list.add(55);
                    list.add(2);
                    list.add(88);
                    list.add(54);
                    list.add(12);
        Stream<Integer> stream = list.stream();
            //过滤
      long count =  stream.filter(num->num!=null).filter(num->num<50).count();
        System.out.println(count);
    }

5 字符串格式化

System.out.printf("Line %s",123);

//输出结果是
Line 123

6 类加载机制

先编译后运行,编译后的文件是一个.class 二进制字节码文件。
JVM加载我们的类去运行。

6.1类的加载

  • 将class 文件加载到内存中,生成一个Class对象。
  • Class 类的实例表示正在运行的 Java 应用程序中的类和接口。
  • 连接
    • 验证 验证是否有正确的内部结构。(成员和构造器)
    • 准备 如果有静态的成员分配内存,默认初始化值。
    • 解析 将类的二进制数据中的符号替换为直接引用。
  • 初始化(new )

6.2 类加载器

将.class 文件加载到内存中,生成对应的Class对象。(运行时类的对象)
我们不需要关系类加载器的加载机制。

  • 类加载器的组成
    • 根类加载器
    • 扩展类加载器(第三方的jar文件)
    • 系统类加载器(环境变量指定的jar路径)

7 反射

反射机制是在运行状态中,对于任意一个类都能够知道类的属性和方法。
对于任意一个对象都能调用他的任意方法和属性
这种获取信息以及调用的对象方法的功能称为反射机制

要解刨一个类,首先要获取类的二进制字节码文件。解剖使用的就是Class类中的方法。

7.0 反射获取Class对象(三种放式)

  • Student stu = new Student();
    Class aClass = stu.getClass();
  • Class c = Student.class:
  • Class classz = Class.forName(“com.hdrj.reflect.Student”);

7.1 反射技术获取字段

     public static  void method()throws Exception{
        //反射技术
        //获取类的Class对象
        Class  classz =  Class.forName("com.hdrj.reflect.Student");
        //com.hdrj.reflect.Student
        System.out.println(classz.getName());

        //获取所有的字段  公共字段。
        Field[] fields = classz.getFields();
        for (Field field : fields) {
            System.out.println("field--"+field);
        }
        //获取所有的字段
        Field[] fields1 = classz.getDeclaredFields();
        for (Field field : fields1) {
            System.out.println(field);
        }
        //获取单个公共的字段
        Field name = classz.getField("address");
        System.out.println(name);

            //实例化对象
        Object o = classz.newInstance();
        //设置值
        name.set(o,"admin");
        //获取 o 对象name 字段的值
        System.out.println(name.get(o));
    }

7.2 反射获取构造器

 Constructor<T> getConstructor(Class<?>... parameterTypes) 
          返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 
 Constructor<?>[] getConstructors()
          返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。



public static  void method3()throws Exception{
        Class  classz =  Class.forName("com.hdrj.reflect.Student");
        Constructor[] constructors =
                classz.getConstructors();
        for (Constructor constructor : constructors) {
            //public com.hdrj.reflect.Student()
            //public com.hdrj.reflect.Student(int,java.lang.String)
            System.out.println(constructor);
        }
        //获取带参数的构造器
        Constructor constructor = classz.getConstructor(int.class, String.class);
        //使用带参数的构造器实例化对象
        Object java = constructor.newInstance(12, "JAVA");
        System.out.println("constructor==="+constructor);
        System.out.println("java==="+java);

    }

7.3 反射获取方法

Method getDeclaredMethod(String name, Class<?>... parameterTypes) 
          返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
Method[] getMethods()
Method getMethod(String name, Class<?>... parameterTypes)
          返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 
Object invoke(Object obj, Object... args) 
          对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。


 public static  void method2()throws Exception{
        Class classz = Class.forName("com.hdrj.reflect.Student");
        //拿到的是自己和父类的方法
        Method[] methods =  classz.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("-----------------------------------------");
        //获取方法
        Method hello = classz.getMethod("hello", null);
        //方法的执行
        Object o = classz.newInstance();
            hello.invoke(o,null);

        Method say = classz.getMethod("say", String.class);
            say.invoke(o,"reflect");

        //获取私有方法执行
     Method sum = classz.getDeclaredMethod("sum", null);
        //暴力访问方法
             sum.setAccessible(true);
             sum.invoke(o,null);
    }