目錄
1.可變參數:
2.Collections:
3.不可變集合:
4.Stream流:
1、什么是流
2、如何生成流
1.單列集合獲取Stream流
2.雙列集合獲取Stream流
3.數組獲取Stream流:
4.一堆零散數據: Stream接口中的靜態方法
3.Stream流的中間方法
1.過濾:把“張”開頭的留下,其余數據過濾不要
2.limit獲取前幾個元素
3.skip跳過前幾個元素
4.元素去重distinct
5.concat合并a和b兩個流為一個流
6.map轉換流中的數據類型
4.Stream流的終結操作
1.void forEach(Consumer action)遍歷
2.long count統計(個數)
3.toArry()收集流中數據放入數組
5.收集方法collect超詳解
6.練習
List系列集合:添加的元素是有序(存取)、可重復、有索引
Set系列集合:添加的元素是無序(沒順序是說沒有存取順序,不是說沒有真實存在的順序)、不重復、無索引
1.可變參數:
1.可變參數本質上就是一個數組
2.作用:在形參中接收多個數據
3.格式:數據類型...參數名稱
eg:int...a
4.注意事項
形參列表中可變參數只能有一個(int...a)
可變參數(int...a)必須放在形參(int b)列表的最后面
public class Main {public static void main(String[] args) {int sum=getSum(1,2,3,4,5,6,7,8,9,10);System.out.println(sum);}public static int getSum(int...args){int sum=0;for (int i : args) {//是值sum+=i;}return sum;}
}
2.Collections:
java.util.collections:是集合工具類
作用:Collections不是集合,而是集合的工具類。
練習:
ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"ad","df","ty","kdh","fjd");System.out.println(list);Collections.shuffle(list);System.out.println(list);
3.不可變集合:
eg:
List<String> list = List.of("aaa", "bbb", "ccc");
總結:
4.Stream流:
1、什么是流
流是從支持數據處理操作的源生成的元素序列,源可以是數組、文件、集合、函數。流不是集合元素,它不是數據結構并不保存數據,它的主要目的在于計算。
?
2、如何生成流
生成流的方式主要有五種
通過集合生成,應用中最常用的一種
1.單列集合獲取Stream流
ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"ad","df","ty","kdh","fjd");list.stream().forEach(s->System.out.println(s));
2.雙列集合獲取Stream流
,要先轉化為單列集合
eg1:hm.keySet().forEach(s->..............
eg2:hm.entrySet(.............
3.數組獲取Stream流:
int[] arr={1,2,3,4,5,6,7};Arrays.stream(arr).forEach(s->System.out.println(s));
4.一堆零散數據: Stream接口中的靜態方法
Stream.of(1,2,3,4).forEach(s->System.out.println(s));
注意4:可以放數組,但是要是引用數據類型的,如果是基本數據類型則會把整個數組當做一個元素放入Stream流
3.Stream流的中間方法
1.過濾:把“張”開頭的留下,其余數據過濾不要
ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"張ad","劉df","張ty","周kdh","fjd");//filter 過濾 把張開頭的過濾留下,其余數據過濾不要list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {//如果返回值為true,表示當前值留下//如果返回值為false,表示當前數據舍棄不要return s.startsWith("張");}}).forEach(s->System.out.println(s));
改成lambda表達式:
list.stream().filter(s->s.startsWith("張")).forEach(s->System.out.println(s));
注意:1.中間方法,返回新的Stream流,原來的Stream流只能使用一次,建議使用鏈式編程
2.修改Stream流中的數據,不影響原來集合或者數組中的數據
2.limit獲取前幾個元素
list.stream().limit(3).forEach(s->System.out.println(s));
3.skip跳過前幾個元素
list.stream().skip(3).forEach(s -> System.out.println(s));
4.元素去重distinct
(依賴hashcode和equals方法)
跟前面的方法一樣,String引用數據類型java已經給你寫好了,直接用就行,但如果你是Student類型需要自己重寫
5.concat合并a和b兩個流為一個流
(盡可能讓兩個數據類型一致,否則就是a和b狗共同的父類了,這樣相當于做了數據類型的提升,提升之后是無法使用子類里面特有的功能的)
ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"張ad","劉df","張ty","周kdh","fjd");ArrayList<String> list2=new ArrayList<>();Collections.addAll(list,"a","b","c","d","e");Stream.concat(list.stream(),list2.stream()).forEach(s->System.out.print(s+" "));//結果:張ad 劉df 張ty 周kdh fjd a b c d e
6.map轉換流中的數據類型
需求:只獲取里面的年齡并進行打印
String->int
第一個類型:流中原本的數據類型
第二個類型:要轉成之后的類型
apply的形參s:依次表示流里面的每一個數據
返回值:表示轉換過后的數據
小細節:當map方法執行完畢后,流上的數據就變成了整數,所以在下面forEach當中,s依次表示流里面的每一個數據,這個數據現在就是整數了
ArrayList<String> list3=new ArrayList<>();Collections.addAll(list3,"張ad-23","劉df-19","張ty-33","周kdh-17","fjd-34");//轉換流中的數據類型list3.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {String[] arr = s.split("-");//這個函數表示String ageString=arr[1];int age=Integer.parseInt(ageString);return age;}//小細節:當map方法執行完畢后,流上的數據就變成了整數//所以在下面forEach當中,s依次表示流里面的每一個數據,這個數據現在就是整數了}).forEach(s->System.out.println(s));
寫成lambda表達式:**********************
//第一個s表示list3里面的每個數據,如“張ad-23”list3.stream()//[1]表示的事split分割函數從“-”分割后面一部分.map(s ->Integer.parseInt(s.split("-")[1])).forEach(s->System.out.println(s));
4.Stream流的終結操作
1.void forEach(Consumer action)遍歷
list.stream().forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});//lambda表達list.stream().forEach(s -> System.out.println(s));
2.long count統計(個數)
//統計(個數)long count = list.stream().count();System.out.println(count);
3.toArry()收集流中數據放入數組
法一:
Object[] arr1 = list.stream().toArray();System.out.println(Arrays.toString(arr1));
法二:
//IntFunction的泛型:具體類型的數組
//apply的形參:流中數據的個數,要跟數組的長度保持一致
//apply的返回值:具體類型的數組//方法體:就是創建數組
//toArray方法的參數的作用:負責創建一個指定類型的數組
//toArray方法的底層,會依次得到流里面的每一個數據,并把數據放到數組當中
//toArray方法的返回值:是一個裝著流里面所有數據的數組
String[] arr=list.stream().toArray(new IntFunction<String[]>() {@Overridepublic String[] apply(int value) {return new String[value];//數組的長度是value}});System.out.println(Arrays.toString(arr));//改成lambda表達式String[] arr2 = list.stream().toArray(value -> new String[value]);System.out.println(Arrays.toString(arr2));
5.收集方法collect超詳解
eg:把所有的男性收集List集合當中
//收集方法collect(Collector collector)ArrayList<String> list4=new ArrayList<>();Collections.addAll(list4,"張ad-男-23","劉df-女-19","張ty-男-33","周kdh-女-17","fjd-男-34");List<String> newList = list4.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList());System.out.println(newList);
eg:把所有的女性收集Set集合當中
Set<String> newList2 = list4.stream().filter(s -> "女".equals(s.split("-")[1])).collect(Collectors.toSet());System.out.println(newList2);
難點:將男性數據收集到雙列集合map中
打印名字和年齡
ArrayList<String> list4=new ArrayList<>();Collections.addAll(list4,"張ad-男-23","劉df-女-19","張ty-男-33","周kdh-女-17","fjd-男-34");Map<String, Integer> newmap1 = list4.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toMap(new Function<String, String>() {@Overridepublic String apply(String s) {return s.split("-")[0];}}, new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s.split("-")[2]);}}));System.out.println(newmap1);//寫成lambdaMap<String, Integer> newmap2 = list4.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toMap(s -> s.split("-")[0],s -> Integer.parseInt(s.split("-")[2])));System.out.println(newmap2);
6.練習
一.
ArrayList<Integer> list=new ArrayList<>();Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);//用lambdaList<Integer> newlist2 = list.stream().filter(s -> s % 2 == 0).collect(Collectors.toList());System.out.println(newlist2);
二.
ArrayList<String> list5=new ArrayList<>();Collections.addAll(list5,"zhangsan,23","lisi,24","wangwu,25");Map<String, Integer> newmap3 = list5.stream().filter(s -> 24 <= Integer.parseInt(s.split(",")[1])).collect(Collectors.toMap(s -> s.split(",")[0],s -> Integer.parseInt(s.split(",")[1])));System.out.println(newmap3);
注意:封裝成Actor對象要用map轉換,新建一個Actor的類包含name,age
//另外寫了一個類ActorArrayList<String> manlist = new ArrayList<>();ArrayList<String> womenlist = new ArrayList<>();Collections.addAll(manlist, "劉大壯,37", "劉小壯,27", "李大壯,35", "李壯,32", "張王,23", "徐樹,12");Collections.addAll(womenlist, "楊芳,14", "秦可卿,25", ",35", "楊奈,42", "楊云朵,21", "宋馨,12");Stream<String> newman = manlist.stream().filter(s -> s.split(",")[0].length() == 3).limit(2);Stream<String> newwomen = womenlist.stream().filter(s -> s.startsWith("楊")).skip(1);//String->Actor對象 (類型轉換map)List<Actor> mwlist = Stream.concat(newman, newwomen).map(new Function<String, Actor>() {@Overridepublic Actor apply(String s) {String name = s.split(",")[0];int age = Integer.parseInt(s.split(",")[1]);return new Actor(name, age);}}).collect(Collectors.toList());System.out.println(mwlist);
用lambda:
// 用lambda表達式List<Actor> mwlist = Stream.concat(newman, newwomen).map(s -> new Actor(s.split(",")[0], Integer.parseInt(s.split(",")[1]))).collect(Collectors.toList());System.out.println(mwlist);
對前面集合還有遍歷知識復習的題目:
題目:斗地主中的存牌,打亂牌,分發牌,排序
import java.util.*;public class PokerGame {static HashMap<Integer, String> hm = new HashMap<>();static ArrayList<Integer> list = new ArrayList<>();//準備牌static {String[] color = {"?", "?", "?", "?"};String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};int serialNumber = 1;for (String n : number) {for (String c : color) {list.add(serialNumber);hm.put(serialNumber++, c + n);}}list.add(serialNumber);hm.put(serialNumber++, "小王");list.add(serialNumber);hm.put(serialNumber, "大王");}public PokerGame() {//洗牌Collections.shuffle(list);//發牌+排序TreeSet<Integer> lord = new TreeSet<>();TreeSet<Integer> player1 = new TreeSet<>();TreeSet<Integer> player2 = new TreeSet<>();TreeSet<Integer> player3 = new TreeSet<>();for (int i = 0; i < list.size(); i++) {if (i <= 2) {lord.add(list.get(i));continue;}if (i % 3 == 0) {player1.add(list.get(i));} else if (i % 3 == 1) {player2.add(list.get(i));} else {player3.add(list.get(i));}}//查看牌lookPoker("地主",lord);lookPoker("鐘英",player1);lookPoker("周雨雨",player2);lookPoker("王二",player3);}public void lookPoker(String name,TreeSet<Integer> player){System.out.print(name+": ");for (Integer serialNumber : player) {String poker=hm.get(serialNumber);System.out.print(poker+" ");}System.out.println();}}