日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JAVA之stream汪文君_Java8新特性之Stream API

發布時間:2023/12/9 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA之stream汪文君_Java8新特性之Stream API 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Stream是Java8中處理集合的關鍵抽象概念,可以指定希望對集合進行的操作,可以執行非常復雜的查找、過濾和映射數據等操作。使用Stream API對集合數據進行操作,就類似于使用SQL執行的數據庫查詢。也可以使用Stream來并行執行操作

Stream和Collection集合的區別:

Collection是一種靜態的內存數據結構,Stream是有關計算的。

需要注意的三點

1??Stream自己不會存儲數據(所以建立在集合的基礎上)

2??Stream不會改變源對象,相反,他們會返回一個持有結果的新Stream

3??Stream操作是延遲執行的,他們會等到需要結果的時候再執行

操作Stream的三個步驟

創建Stream:通過數據源(集合、數組)獲取一個流

中間操作:中間操作鏈,對數據源的數據進行處理

終止操作:一旦執行終止操作,就執行中間操作鏈,并產生結果,之后不會再被使用(延遲執行)

創建Stream

方式一:通過集合

//通過集合創建stream List接口中的默認方法

@Test

public void test1(){

List integers = Arrays.asList(1, 2, 4, 5, 7, 8, 9, 9);

//default Stream stream():返回一個順序流

Stream stream = integers.stream();

//default Stream parallelStream():返回一個并行流

Stream parallelStream = integers.parallelStream();

}

方式二:通過Arrays

通過Arrays中的靜態方法,能夠處理對應基本類型的數組生成相應的流(IntStream,LongStream,DoubleStream),也可以生成帶泛型的流

//通過數組Arrays中的靜態方法

@Test

public void test2(){

int[] arrs = new int[]{1,2,4,5,6,6,7,7};

IntStream stream = Arrays.stream(arrs);

String[] names = new String[]{"ssy","cf"};

Stream stringStream = Arrays.stream(names);

}

方式三:通過Stream的of()

@Test

public void test3(){

Stream stream = Stream.of(1,2,4,5,5,8);

}

方式四:通過Stream創建無限流

@Test

public void test4(){

//public static Stream iterate(T seed, java.util.function.UnaryOperator f)

Stream.iterate(0,t->t+2).limit(20).forEach(System.out::println);

//public static Stream generate(java.util.function.Supplier s)

Stream.generate(Math::random).limit(20).forEach(System.out::println);

}

Stream的中間操作

多個中間操作可以鏈接起來形成一個流水線,除非流水線上觸發終止操作,否則中間操作不會執行任何的處理!而在終止操作時一次性全部處理,稱為“惰性求值”

1、篩選與切片

filter(Predicate p)接受Lambda,從流中排除某些元素

distinct()篩選,通過流生成元素的hashcode和equals去除重復元素

limit(long maxSize)截斷流,使元素不超過給定的數量

skip(long n)跳過元素,返回一個扔掉了前n個元素的流。若流中元素不足n個,則返回一個空流

@Test

public void test5(){

List names = Arrays.asList("Tom", "Ssy", "Cf", "Sherry", "Juddy");

Stream stream = names.stream();

stream.filter(name -> name.length()<=3).forEach(System.out::println);

System.out.println("*************");

//終止操作后不能再操作該stream,需要重新生成

names.stream().limit(3).forEach(System.out::println);

System.out.println("**************");

names.stream().skip(2).forEach(System.out::println);

System.out.println("****************");

List names1 = new ArrayList<>(names);//因為asList的結果不能add了

names1.add("Yu");

names1.add("Yu");

names1.add("Yu");

names1.add("Yu");

System.out.println(names1.toString());

names1.stream().distinct().forEach(System.out::println);

}

2、映射

map(Function f) 接受一個函數作為參數,該函數會被應用到每個元素上,并將其映射為一個新的元素

flatMap(Function f) 接收一個函數作為參數,將流中的每個值都轉換成另一個流,然后將所有流連接成一個流

兩者之間的關系類似于下述關系

@Test

public void test6(){

List list=new ArrayList(Arrays.asList(1,2,3,4));

List list1 = Arrays.asList(5,6,7,8);

list.add(list1);

System.out.println(list);

List list2=new ArrayList(Arrays.asList(1,2,3,4));

list2.addAll(list1);

System.out.println(list2);

}

例子

@Test

public void test7(){

//map

List strings = Arrays.asList("aa", "bb", "cc");

strings.stream().map(String::toUpperCase).forEach(System.out::println);

//flatMap

strings.stream().map(StreamTest::fromStringToStream).forEach(System.out::println);

strings.stream().flatMap(StreamTest::fromStringToStream).forEach(System.out::println);

}

public static Stream fromStringToStream(String str){

char[] strs = str.toCharArray();

ArrayList arrs = new ArrayList<>();

for(char c:strs){

arrs.add(c);

}

return arrs.stream();

}

3、排序

自然排序與定制排序

@Test

public void test8(){

//sorted()

List integers = Arrays.asList(34, 64, 23, 6, 53, 77);

integers.stream().sorted().forEach(System.out::println);

//sorted(Comparator com)

List employees = new ArrayList<>();

employees.stream().sorted((e1,e2) -> Integer.compare(e1.getAge(), e2.getAge())).forEach(System.out::println);

}

Stream的終止操作

終止操作會從流的流水線生成結果,其結果可以是任何不是流的指,例如List、Integer,甚至是void。流進行終止操作后,不能再次使用

1、匹配與查找

allMatch(Predicate p) 檢查是否匹配所有元素

anyMatch(Predicate p) 檢查是否至少匹配一個元素

noneMatch(Predicate p) 檢查是否沒有元素匹配

findFirst()返回第一個元素

findAny() 返回當前流中的任意元素

count() 返回流中元素的總個數

max(Comparator) 返回流中的最大值

min(Comparator)返回流中的最小值

forEach(Consumer c)內部迭代

2、規約

reduce(T identity, BinaryOperator b)可以將流中的元素反復結合起來,得到一個值,返回T

@Test

public void test9(){

//計算1-10自然數的和

Integer reduce = Stream.iterate(1, e -> e + 1).limit(10).reduce(0, Integer::sum);

System.out.println(reduce);

}

reduce(BinaryOperator b)可以將流中的元素反復結合起來,得到一個值,返回 Optional (在optional相關類中再講)

3、收集

collect(Collector c) 將流轉換為其他形式,接受一個collector接口的實現,用于給Stream中元素做匯總的方法

Collectors實用類,方便地創建常見收集器實例

@Test

public void test10(){

List integers = Arrays.asList(34, 64, 23, 6, 53, 77);

List collect = integers.stream().collect(Collectors.toList());

collect.forEach(System.out::println);

}

總結

以上是生活随笔為你收集整理的JAVA之stream汪文君_Java8新特性之Stream API的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。