華同學. 于 2022-08-03 10:15:07 發(fā)布 1686 收藏 2 分類專欄: 練習 文章標簽: java 版權 練習 專欄收錄該內(nèi)容 13 篇文章0 訂閱 訂閱專欄 Stream流思想: 就相當于流水線一樣,一道工序一道工序的進行排查,得出最后結(jié)果。 1.創(chuàng)建Stream流對象 1.1單列集合創(chuàng)建Stream流 // 單列 創(chuàng)建Stream List 可重復的 List<String> list = List.of("張三","李四","王五"); Stream<String> stream1 = list.stream(); // 單列不可重復的 Set<String> set = Set.of("張三","李四","王五"); Stream<String> stream2 = set.stream(); 1.2雙列集合創(chuàng)建Stream流對象 // 雙列 不能直接產(chǎn)生Stream流對象,而是通過先轉(zhuǎn)單 Map<String, Integer> map = Map.of("張三", 19, "李四", 30); Set<String> set1 = map.keySet(); Stream<String> stream = set1.stream(); 注意:雙列集合不能直接創(chuàng)建Stream流對象,要用它的 keySet()方法 獲取到單列集合。 3.數(shù)組 創(chuàng)建流對象 // 數(shù)組 int[] arr = {1,2,3}; IntStream stream3 = Arrays.stream(arr); 數(shù)組要通過它的Arrays工具類 進行創(chuàng)建 Stream流。 4.相同類型; Stream<String> stream4 = Stream.of("張三", "李四", "王五", "趙六"); 2.Stream流常用方法 1.中間方法 概念:執(zhí)行完此方法之后,Stream流依然可以繼續(xù)執(zhí)行其他操作 方法名 說明 Stream<T> filter(Predicate predicate) 用于對流中的數(shù)據(jù)進行過濾 Stream<T> limit(long maxSize) 返回此流中的元素組成的流,截取前指定參數(shù)個數(shù)的數(shù)據(jù) Stream<T> skip(long n) 跳過指定參數(shù)個數(shù)的數(shù)據(jù),返回由該流的剩余元素組成的流 static <T> Stream<T> concat(Stream a, Stream b) 合并a和b兩個流為一個流 Stream<T> distinct() 返回由該流的不同元素(根據(jù)Object.equals(Object) )組成的流 Stream<T> sorted() 返回由此流的元素組成的流,根據(jù)自然順序排序 Stream<T> sorted(Comparator comparator) 返回由該流的元素組成的流,根據(jù)提供的Comparator進行排序 <R> Stream<R> map(Function mapper) 返回由給定函數(shù)應用于此流的元素的結(jié)果組成的流 IntStream mapToInt(ToIntFunction mapper) 返回一個IntStream其中包含將給定函數(shù)應用于此流的元素的結(jié)果 展示幾個常用方法: 1.filter(s -> 關系表達式) 過濾 保留返回值為true 的 public class MyStream3 { public static void main(String[] args) { // Stream<T> filter(Predicate predicate):過濾 // Predicate接口中的方法 boolean test(T t):對給定的參數(shù)進行判斷,返回一個布爾值 ArrayList<String> list = new ArrayList<>(); list.add("張三豐"); list.add("張無忌"); list.add("張翠山"); list.add("王二麻子"); list.add("張良"); list.add("謝廣坤"); //filter方法獲取流中的 每一個數(shù)據(jù). //而test方法中的s,就依次表示流中的每一個數(shù)據(jù). //我們只要在test方法中對s進行判斷就可以了. //如果判斷的結(jié)果為true,則當前的數(shù)據(jù)留下 //如果判斷的結(jié)果為false,則當前數(shù)據(jù)就不要. // list.stream().filter( // new Predicate<String>() { // @Override // public boolean test(String s) { // boolean result = s.startsWith("張"); // return result; // } // } // ).forEach(s-> System.out.println(s)); //因為Predicate接口中只有一個抽象方法test //所以我們可以使用lambda表達式來簡化 // list.stream().filter( // (String s)->{ // boolean result = s.startsWith("張"); // return result; // } // ).forEach(s-> System.out.println(s));、 //最后簡化成 list.stream().filter(s ->s.startsWith("張")).forEach(s-> System.out.println(s)); } } 2.limit(n) 保留前n個 skip(n) 跳過 前n個 public class StreamDemo02 { public static void main(String[] args) { //創(chuàng)建一個集合,存儲多個字符串元素 ArrayList<String> list = new ArrayList<String>(); list.add("林青霞"); list.add("張曼玉"); list.add("王祖賢"); list.add("柳巖"); list.add("張敏"); list.add("張無忌"); //需求1:取前3個數(shù)據(jù)在控制臺輸出 list.stream().limit(3).forEach(s-> System.out.println(s)); System.out.println("--------"); //需求2:跳過3個元素,把剩下的元素在控制臺輸出 list.stream().skip(3).forEach(s-> System.out.println(s)); System.out.println("--------"); //需求3:跳過2個元素,把剩下的元素中前2個在控制臺輸出 list.stream().skip(2).limit(2).forEach(s-> System.out.println(s)); } } 3.concat() 靜態(tài)方法 類名直接調(diào)用 連接 distinct() 去重方法 public class StreamDemo03 { public static void main(String[] args) { //創(chuàng)建一個集合,存儲多個字符串元素 ArrayList<String> list = new ArrayList<String>(); list.add("林青霞"); list.add("張曼玉"); list.add("王祖賢"); list.add("柳巖"); list.add("張敏"); list.add("張無忌"); //需求1:取前4個數(shù)據(jù)組成一個流 Stream<String> s1 = list.stream().limit(4); //需求2:跳過2個數(shù)據(jù)組成一個流 Stream<String> s2 = list.stream().skip(2); //需求3:合并需求1和需求2得到的流,并把結(jié)果在控制臺輸出 // Stream.concat(s1,s2).forEach(s-> System.out.println(s)); //需求4:合并需求1和需求2得到的流,并把結(jié)果在控制臺輸出,要求字符串元素不能重復 Stream.concat(s1,s2).distinct().forEach(s-> System.out.println(s)); } } 2.終結(jié)方法 常見方法 方法名 說明 void forEach(Consumer action) 對此流的每個元素執(zhí)行操作 long count() 返回此流中的元素數(shù) public class MyStream5 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("張三豐"); list.add("張無忌"); list.add("張翠山"); list.add("王二麻子"); list.add("張良"); list.add("謝廣坤"); //method1(list); // long count():返回此流中的元素數(shù) long count = list.stream().count(); System.out.println(count); } private static void method1(ArrayList<String> list) { // void forEach(Consumer action):對此流的每個元素執(zhí)行操作 // Consumer接口中的方法void accept(T t):對給定的參數(shù)執(zhí)行此操作 //在forEach方法的底層,會循環(huán)獲取到流中的每一個數(shù)據(jù). //并循環(huán)調(diào)用accept方法,并把每一個數(shù)據(jù)傳遞給accept方法 //s就依次表示了流中的每一個數(shù)據(jù). //所以,我們只要在accept方法中,寫上處理的業(yè)務邏輯就可以了. list.stream().forEach( new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } } ); System.out.println("===================="); //lambda表達式的簡化格式 //是因為Consumer接口中,只有一個accept方法 list.stream().forEach( (String s)->{ System.out.println(s); } ); System.out.println("===================="); //lambda表達式還是可以進一步簡化的. list.stream().forEach(s->System.out.println(s)); } } 注意:調(diào)用完終結(jié)方法就會直接關閉該流,不能再調(diào)用中間方法。 ;分號也有終結(jié)的作用。 3.Stream流的收集操作****** 對數(shù)據(jù)使用Stream流的方式操作完畢后,可以把流中的數(shù)據(jù)收集到集合中 常用方法: 方法名 說明 R collect(Collector collector) 把結(jié)果收集到集合中 工具類Collectors提供了具體的收集方式 方法名 說明 public static <T> Collector toList() 把元素收集到List集合中 public static <T> Collector toSet() 把元素收集到Set集合中 public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中 1.收集到List集合 List<Integer> list = List.of(1,2,3,4,5,6,7,8,9,10,10); //收集成一個list集合 Stream<Integer> stream = list.stream(); List<Integer> list2 = stream.filter(s -> s % 2 == 0).collect(Collectors.toList()); System.out.println(list2); 2.收集到Set集合 // 將數(shù)組去重 收集到 set集合中 Stream<Integer> stream2 = list.stream(); Set<Integer> set = stream2.filter(s -> s % 2 == 0).distinct().collect(Collectors.toSet()); System.out.println(set); 3.收集到Map集合 ArrayList<String> list = new ArrayList<>(); list.add("張三,25"); list.add("李四,24"); list.add("王五,21"); list.add("趙六,28"); // 創(chuàng)建Map對象 HashMap<String,Integer> map = new HashMap<>(); Stream<String> stream = list.stream(); // 用Map接收 Map<String, String> map1 = stream.filter(s -> { // 截取字符串 String[] strarr = s.split(","); String name = strarr[0];//獲取到名字 int age = Integer.parseInt(strarr[1]); return age >= 24; }).collect(Collectors.toMap( s -> s.split(",")[0], s -> s.split(",")[1] )); System.out.println(map1); 文章知識點與官方知識檔案匹配,可進一步學習相關知識 ———————————————— 版權聲明:本文為CSDN博主「華同學.」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/weixin_50769390/article/details/126109476 |
|