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
;
如果要實作需求:

那麼按照正常的操作:
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操作有三步:例如:
第一步:生成流。
常見的生成流的操作有:
stream中間流操作
filter
limit和skip
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(截然不同的)不是拆分流,而是删除流中的重複元素。
sorted
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
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終結操作
stream流的收集操作
将stream流中的資料收集回集合。
對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);
}
反射
類加載器
類加載
396 類加載器
範例程式:
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
*/
}
反射
反射概述
擷取Class類的對象
範例程式:
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);
}
反射擷取構造方法并使用
範例程式:
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修飾的,無法正常建立對象,此時可以通過暴力反射(取消通路檢查)來建立。
反射擷取成員變量并使用
反射擷取成員方法并使用
注意:最後的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 通過反射運作配置檔案指定的内容
觀看視訊比較直覺