天天看點

Java學習筆記 2021-7-1 2021-7-8Stream流反射

Java學習筆記

  • Stream流
    • 1 Stream流的體驗
    • stream流的生成操作
    • stream中間流操作
      • filter
      • limit和skip
      • concat和distinct
      • sorted
      • map和mapToInt
    • stream終結操作
    • stream流的收集操作
  • 反射
    • 類加載器
      • 類加載
      • 396 類加載器
    • 反射
      • 反射概述
      • 擷取Class類的對象
      • 反射擷取構造方法并使用
      • 反射擷取成員變量并使用
      • 反射擷取成員方法并使用
      • 反射之越過泛型檢查
      • 407 通過反射運作配置檔案指定的内容

Stream流

1 Stream流的體驗

//附加:

String s ="";

,注意

s.length()

為0,但是此時

s !=null

如果要實作需求:

Java學習筆記 2021-7-1 2021-7-8Stream流反射

那麼按照正常的操作:

public static void main(String[] args) {
        ArrayList<String> array = new ArrayList<>();
        array.add("林青霞");
        array.add("張曼玉");
        array.add("王祖賢");
        array.add("柳岩");
        array.add("張明");
        array.add("");
        ArrayList<String> array2 = new ArrayList<>();
        ArrayList<String> array3 = new ArrayList<>();
        for(String s:array){
           if (s.startsWith("張")){
               array2.add(s);
               if (s.length()==3){
                   array3.add(s);
               }
           }
        }
    }
           

如果使用stream流的話:

public static void main(String[] args) {
        ArrayList<String> array = new ArrayList<>();
        array.add("林青霞");
        array.add("張曼玉");
        array.add("王祖賢");
        array.add("柳岩");
        array.add("張明");
        array.add("");
        ArrayList<String> array3 = new ArrayList<>();
        //stream為了友善閱讀才分行了,實際上一行就夠了。
        //直接閱讀代碼即可友善的明白無關邏輯方式的語意
        array.stream().filter(s -> s.startsWith("張"))
                .filter(s -> s.length()==3)
                .forEach(array3::add);
        System.out.println(array3);
    }
           

stream流的生成操作

stream操作有三步:例如:

Java學習筆記 2021-7-1 2021-7-8Stream流反射

第一步:生成流。

常見的生成流的操作有:

Java學習筆記 2021-7-1 2021-7-8Stream流反射
Java學習筆記 2021-7-1 2021-7-8Stream流反射

stream中間流操作

Java學習筆記 2021-7-1 2021-7-8Stream流反射

filter

limit和skip

Java學習筆記 2021-7-1 2021-7-8Stream流反射
public static void main(String[] args) {
        ArrayList<String> array1 = new ArrayList<>();
        array1.add("1");
        array1.add("2");
        array1.add("3");
        array1.add("4");
        array1.add("5");
        array1.add("6");
        array1.stream().skip(2).forEach(System.out::println);
        array1.stream().limit(2).forEach(System.out::println);
    }
           

concat和distinct

concat是合并流,distinct(截然不同的)不是拆分流,而是删除流中的重複元素。

Java學習筆記 2021-7-1 2021-7-8Stream流反射

sorted

Java學習筆記 2021-7-1 2021-7-8Stream流反射
public static void main(String[] args) {
    ArrayList<String> array1 = new ArrayList<>();
    array1.add("lqx");
    array1.add("zmy");
    array1.add("gdg");
    array1.add("wsq");
    array1.add("wrq");
    array1.add("fhcq");
   array1.stream().sorted((s1,s2)->{//排序結果:先按長度排,長度一樣的按自然排序結果排
       int num = s1.length()-s2.length();
       return num==0?s1.compareTo(s2):num;//compareTo 方法:傳回自然排序的結果
   }).forEach(System.out::println);
}
           

map和mapToInt

Java學習筆記 2021-7-1 2021-7-8Stream流反射
public static void main(String[] args) {
        ArrayList<String> array1 = new ArrayList<>();
        array1.add("15");
        array1.add("6");
        array1.add("52");
        array1.add("97");
        array1.add("24");
        array1.add("33");
        array1.stream().map(Integer::parseInt).forEach(System.out::println);
        //mapToInt方法傳回的是IntStream,裡面全是Int形資料,是以相比較于單獨的Stream,多一些方法,比如下面的sum方法
        int sum = array1.stream().mapToInt(Integer::parseInt).sum();
        System.out.println(sum);
    }
           

stream終結操作

Java學習筆記 2021-7-1 2021-7-8Stream流反射

stream流的收集操作

将stream流中的資料收集回集合。

Java學習筆記 2021-7-1 2021-7-8Stream流反射

對toMap的範例程式:

public static void main(String[] args) {
        String[] strArray = {"林青霞,30","張曼玉,35","王祖賢,33","柳岩,25"};
        Map<String, Integer> map = Stream.of(strArray).collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));//兩個Function的參數都是一樣的字元串。
        System.out.println(map);

    }
           

反射

類加載器

類加載

Java學習筆記 2021-7-1 2021-7-8Stream流反射
Java學習筆記 2021-7-1 2021-7-8Stream流反射

396 類加載器

Java學習筆記 2021-7-1 2021-7-8Stream流反射
Java學習筆記 2021-7-1 2021-7-8Stream流反射

範例程式:

public static void main(String[] args) {
        ClassLoader c1 = ClassLoader.getSystemClassLoader();
        ClassLoader c1Parent = c1.getParent();
        ClassLoader c1ParentParent = c1Parent.getParent();
        System.out.println(c1);
        System.out.println(c1Parent);
        System.out.println(c1ParentParent);
        /*
		程式輸出:
		[email protected]
		jdk.inter[email protected]
		null
		*/
    }
           

反射

反射概述

Java學習筆記 2021-7-1 2021-7-8Stream流反射

擷取Class類的對象

Java學習筆記 2021-7-1 2021-7-8Stream流反射

範例程式:

public static void main(String[] args) throws ClassNotFoundException {
        Class<Student> c1 = Student.class;
        System.out.println(c1);
        Student s1 = new Student();
        Class<? extends Student> c2 = s1.getClass();
        System.out.println(c2);
        Class<?> c3 = Class.forName("Lei.Student");
        System.out.println(c3);
    }
           

反射擷取構造方法并使用

Java學習筆記 2021-7-1 2021-7-8Stream流反射

範例程式:

public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException {
        //1.擷取位元組碼檔案
        Class<?> c1 = Class.forName("Lei.Student");
        //2.通過位元組碼檔案擷取構造方法類
        Constructor<?> constructor = c1.getConstructor(int.class, String.class);
        //3.通過構造方法建立執行個體
        Object s1 = constructor.newInstance(30, "王祖賢");
        System.out.println(s1);
    }
           

使用此方法時如果改用getDeclaredConstructor方法擷取private修飾的私有構造方法會報錯,因為是private修飾的,無法正常建立對象,此時可以通過暴力反射(取消通路檢查)來建立。

Java學習筆記 2021-7-1 2021-7-8Stream流反射

反射擷取成員變量并使用

Java學習筆記 2021-7-1 2021-7-8Stream流反射

反射擷取成員方法并使用

Java學習筆記 2021-7-1 2021-7-8Stream流反射

注意:最後的invoke傳回的是一個null的Object,調用方法的是傳入的那個Object類。範例代碼:

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        Class<?> c = Class.forName("Lei.Student");
        Method[] methods = c.getDeclaredMethods();
        Method setAgeMethod = c.getDeclaredMethod("setAge", int.class);
        Object obj = c.getConstructor(int.class, String.class).newInstance(20, "lqx");
        Object invokeObj = setAgeMethod.invoke(obj, 25);
        System.out.println(invokeObj);//顯示null
        System.out.println(obj);//年齡已經修改為25
    }
           

反射之越過泛型檢查

public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ArrayList<Integer> array = new ArrayList<>();//指定了Integer類型
        Class<? extends ArrayList> c = array.getClass();
        Method addMethod = c.getMethod("add", Object.class);//反射越過泛型檢查
        addMethod.invoke(array,"nihao");
        addMethod.invoke(array,"Miho");
        addMethod.invoke(array,"Miho");
        System.out.println(array);
    }
           

407 通過反射運作配置檔案指定的内容

觀看視訊比較直覺