java 1.8 SteamAPI认识
一、關于Stream前言
Stream是 Java 8 的一大亮點,得盡快學會用哦,都2020年了還不會得我得抓緊了。
1、Stream關注的是對數(shù)據(jù)的運算,與CPU打交道;集合關注的是數(shù)據(jù)的存儲,與內(nèi)存打交道
2、
①Stream自己不會存儲元素。
②Stream不會改變源對象。相反,他們會返回一個特有接口的新Stream.
③Stream操作是延遲執(zhí)行的。這意味著他們會等到需要結果的時候才執(zhí)行
3、Stream執(zhí)行流程
①Stream的實例化
②一系列的中間操作(過濾、映射、…)
③終止操作
4、說明:
4.1、一個中間操作鏈,對數(shù)據(jù)源的數(shù)據(jù)進行處理;
4.2、一旦執(zhí)行終止操作,就執(zhí)行中間操作鏈,并產(chǎn)生接口。之后,不會再被使用
參考B站視頻(尚硅谷java高級語言)
二、操作Stream
(一)、實例化
//創(chuàng)建Stream方式一:通過集合@Testpublic void test1(){List<Integer> list = new ArrayList<>();list.add(123);//default Stream<E> stream():返回一個順序流Stream<Integer> stream = list.stream();//串行流//default Stream<E> parallelStream():返回一個順序流Stream<Integer> integerStream = list.parallelStream();//并行流}//創(chuàng)建Stream方式二:通過數(shù)組@Testpublic void test2(){int[] arr ={1,3,10};IntStream stream1 = Arrays.stream(arr);Integer[] integers ={3,8,1};Stream<Integer> stream2 = Arrays.stream(integers);}//創(chuàng)建Stream方式三:通過Stream的of();@Testpublic void test3(){Stream<Integer> stream = Stream.of(1,2,3,4,5,6);}//創(chuàng)建Stream方式四:創(chuàng)建無限流@Testpublic void test4(){//迭代 // public static<T> Stream<T> iterate(final T seed,fianl UnarOperator<T> f)//遍歷前10個偶數(shù)Stream.iterate(0,t->t+2).limit(10).forEach(System.out::println);//生成 // public static<T> Stream<T> generate(Supplier<T> s)Stream.generate(Math::random).limit(10).forEach(System.out::println);}(二)中間操作
2.1 篩選與切片
不知所以然,但通過代碼操作還是大概能知道其設計目的。
//篩選與切片@Testpublic void test1(){ // filter----接收Lambda,從流中排除某些元素List<Integer> list = new ArrayList<>();list.add(123); list.add(345); list.add(237); list.add(912);Stream<Integer> stream = list.stream();stream.filter(integer -> integer>300).forEach(System.out::println);//兩行代碼查出了值大于300的數(shù)據(jù)System.out.println("*************************************************"); // limit----截斷流,使其元素不超過給定數(shù)量list.stream().limit(3).forEach(System.out::println);//數(shù)據(jù)的前3條System.out.println("*************************************************"); // skip----跳過元素返回一個拋棄了前n個元素的流,若流中元素不滿足n個,則返回一個空流,與limit形成互補list.stream().skip(3).forEach(System.out::println);System.out.println("*************************************************"); // distinct----篩選,通過流所所生成元素的hashCode()和equals()去除重復元素list.add(456); list.add(222); list.add(101); list.add(123); list.add(891); list.add(123);list.stream().distinct().forEach(System.out::println);}2.2映射
//映射@Testpublic void test2(){ // map(Function f)----接收Lambda,將元素轉(zhuǎn)換為其他形式或提取信息時,接收一個函數(shù)作為參數(shù),該函數(shù)被應用到每個元素上,并將其映射成一個新的元素List<String> strings = Arrays.asList("aa", "bb", "cc", "dd", "eeee", "ffff");strings.stream().map(str -> str.toUpperCase()).forEach(System.out::println); // 練習1:strings.stream().map(str->str.length()>3).forEach(System.out::println);//練習2:Stream<Stream<Character>> streamStream = strings.stream().map(StreamAPITest1::fromStringToStream);streamStream.forEach(s->{s.forEach(System.out::println);});System.out.println("**************************************"); // flatMap----接收一個函數(shù)作為參數(shù),將流中的每個值都換成另一個流,然后把所有流連接一個流Stream<Character> characterStream = strings.stream().flatMap(StreamAPITest1::fromStringToStream);characterStream.forEach(System.out::println);}//將字符串中的多個字符構成的集合轉(zhuǎn)換為對于的Stream的實例public static Stream<Character> fromStringToStream(String str){ArrayList<Character> list = new ArrayList<>();for(Character c: str.toCharArray()){list.add(c);}return list.stream();}兩個映射操作有點向集合中add()和addall()方法,可以自己去體會。
2.3 排序
//排序@Testpublic void test3(){ // sorted() 自然排序 按照Comparable的方式,如果自定義類等需實現(xiàn)相關的Comparable接口List<String> list = Arrays.asList("aa","cc","bb");Stream<String> stream3 = list.stream().sorted();stream3.forEach(System.out::println); // sorted( Comparator com)定制排序List<Integer> arr = Arrays.asList(1,3,2,6,8,3,9);arr.stream().sorted((i1,i2)->{return Integer.compare(i1,i2);}).forEach(System.out::println);}(三)終止操作
一切盡在代碼中
3.1查找與匹配
//查找與匹配@Testpublic void test1(){ // allMatch----檢查是否匹配所有元素List<Integer> list = Arrays.asList(1,3,2,6,8,3,9);boolean b = list.stream().allMatch(x -> x > 3);System.out.println(b);//false // anyMatch----檢查是否有匹配至少一個元素boolean b1 = list.stream().anyMatch(x -> x == 3);System.out.println(b1);//true // noneMatch----檢查是否沒有匹配的元素boolean b2 = list.stream().noneMatch(x -> x > 10);System.out.println(b2);//true // findFirst----返回第一個元素Optional<Integer> first = list.stream().findFirst();System.out.println(first);//Optional[1] // findAny----返回當前流中的任意一元素Optional<Integer> any = list.stream().findAny();System.out.println(any);//Optional[1] // count-----返回流中元素的總數(shù)long count = list.stream().count();System.out.println(count);//7 // max----返回流中最大值Optional<Integer> max = list.stream().max(Integer::compareTo);System.out.println(max);//Optional[9] // min----返回流中的最小值Optional<Integer> min = list.stream().min(Integer::compareTo);System.out.println(min);//Optional[1] // forEach----遍歷流中的元素}3.2歸約
//歸約@Testpublic void test2(){ // reduce(T identity,BinaryOperator)—可以將流中元素反復結合起來得到一個值,返回T // 練習1:計算1-10的自然數(shù)的和List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);Integer reduce = list.stream().reduce(0, Integer::sum);System.out.println(reduce);//55 // reduce(BinaryOpreator)----可以將流中元素反復結合起來,返回Optional< T >Optional<Integer> reduce1 = list.stream().reduce((x, y) -> x + y);System.out.println(reduce1.get());//55}3.3 收集
③收集
collect----將流轉(zhuǎn)換為其他形式,接收一個Collector接口的實現(xiàn),用于給Stream中元素做匯總的方法
Colloector 接口中方法的實現(xiàn)決定了如何對流執(zhí)行手機操作(如收集到List、Set、Map中)但是Collectots實用類提供了很多靜態(tài)方法,可以方便的創(chuàng)建常見收集器實例
這里暫時先不寫了,可先參考Colloector接口相應的方法。
總結
以上是生活随笔為你收集整理的java 1.8 SteamAPI认识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浏览器事件:为什么会有捕获过程和冒泡过程
- 下一篇: 产品经理(012)-竞品调研