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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Stream流常用操作(超全+实例)

發(fā)布時(shí)間:2023/12/9 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Stream流常用操作(超全+实例) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

創(chuàng)建流

單列集合: 集合對(duì)象.stream()

List<Author> authors = getAuthors();Stream<Author> stream = authors.stream();

數(shù)組:Arrays.stream(數(shù)組)或者使用Stream.of來(lái)創(chuàng)建

Integer[] arr = {1,2,3,4,5};Stream<Integer> stream = Arrays.stream(arr);Stream<Integer> stream2 = Stream.of(arr);

雙列集合:轉(zhuǎn)換成單列集合后再創(chuàng)建

Map<String,Integer> map = new HashMap<>();map.put("蠟筆小新",19);map.put("黑子",17);map.put("日向翔陽(yáng)",16);Stream<Map.Entry<String, Integer>> stream = map.entrySet().stream();

中間操作

filter

可以對(duì)流中的元素進(jìn)行條件過(guò)濾,符合過(guò)濾條件的才能繼續(xù)留在流中。

例如:

打印所有姓名長(zhǎng)度大于1的作家的姓名List<Author> authors = getAuthors();authors.stream().filter(author -> author.getName().length()>1).forEach(author -> System.out.println(author.getName()));

map

可以把對(duì)流中的元素進(jìn)行計(jì)算或轉(zhuǎn)換。

例如:

打印所有作家的姓名List<Author> authors = getAuthors();authors.stream().map(author -> author.getName()).forEach(name->System.out.println(name));// 打印所有作家的姓名List<Author> authors = getAuthors();// authors.stream() // .map(author -> author.getName()) // .forEach(s -> System.out.println(s));authors.stream().map(author -> author.getAge()).map(age->age+10).forEach(age-> System.out.println(age));

distinct

可以去除流中的重復(fù)元素。

例如:

打印所有作家的姓名,并且要求其中不能有重復(fù)元素。List<Author> authors = getAuthors();authors.stream().distinct().forEach(author -> System.out.println(author.getName()));

注意:distinct方法是依賴Object的equals方法來(lái)判斷是否是相同對(duì)象的。所以需要注意重寫equals方法。

sorted

可以對(duì)流中的元素進(jìn)行排序。

例如:

對(duì)流中的元素按照年齡進(jìn)行降序排序,并且要求不能有重復(fù)的元素。List<Author> authors = getAuthors(); // 對(duì)流中的元素按照年齡進(jìn)行降序排序,并且要求不能有重復(fù)的元素。authors.stream().distinct().sorted().forEach(author -> System.out.println(author.getAge()));List<Author> authors = getAuthors(); // 對(duì)流中的元素按照年齡進(jìn)行降序排序,并且要求不能有重復(fù)的元素。authors.stream().distinct().sorted((o1, o2) -> o2.getAge()-o1.getAge()).forEach(author -> System.out.println(author.getAge()));

注意:如果調(diào)用空參的sorted()方法,需要流中的元素是實(shí)現(xiàn)了Comparable。

limit

可以設(shè)置流的最大長(zhǎng)度,超出的部分將被拋棄。

例如:

對(duì)流中的元素按照年齡進(jìn)行降序排序,并且要求不能有重復(fù)的元素,然后打印其中年齡最大的兩個(gè)作家的姓名。List<Author> authors = getAuthors();authors.stream().distinct().sorted().limit(2).forEach(author -> System.out.println(author.getName()));

skip

跳過(guò)流中的前n個(gè)元素,返回剩下的元素

例如:

打印除了年齡最大的作家外的其他作家,要求不能有重復(fù)元素,并且按照年齡降序排序。// 打印除了年齡最大的作家外的其他作家,要求不能有重復(fù)元素,并且按照年齡降序排序。List<Author> authors = getAuthors();authors.stream().distinct().sorted().skip(1).forEach(author -> System.out.println(author.getName()));

flatMap

map只能把一個(gè)對(duì)象轉(zhuǎn)換成另一個(gè)對(duì)象來(lái)作為流中的元素。而flatMap可以把一個(gè)對(duì)象轉(zhuǎn)換成多個(gè)對(duì)象作為流中的元素。

例一:

打印所有書籍的名字。要求對(duì)重復(fù)的元素進(jìn)行去重。// 打印所有書籍的名字。要求對(duì)重復(fù)的元素進(jìn)行去重。List<Author> authors = getAuthors();authors.stream().flatMap(author -> author.getBooks().stream()).distinct().forEach(book -> System.out.println(book.getName()));

例二:

打印現(xiàn)有數(shù)據(jù)的所有分類。要求對(duì)分類進(jìn)行去重。不能出現(xiàn)這種格式:哲學(xué),愛情// 打印現(xiàn)有數(shù)據(jù)的所有分類。要求對(duì)分類進(jìn)行去重。不能出現(xiàn)這種格式:哲學(xué),愛情 愛情L(zhǎng)ist<Author> authors = getAuthors();authors.stream().flatMap(author -> author.getBooks().stream()).distinct().flatMap(book -> Arrays.stream(book.getCategory().split(","))).distinct().forEach(category-> System.out.println(category));

終結(jié)操作

forEach

對(duì)流中的元素進(jìn)行遍歷操作,我們通過(guò)傳入的參數(shù)去指定對(duì)遍歷到的元素進(jìn)行什么具體操作。

例子:

輸出所有作家的名字// 輸出所有作家的名字List<Author> authors = getAuthors();authors.stream().map(author -> author.getName()).distinct().forEach(name-> System.out.println(name));

count

可以用來(lái)獲取當(dāng)前流中元素的個(gè)數(shù)。

例子:

打印這些作家的所出書籍的數(shù)目,注意刪除重復(fù)元素。// 打印這些作家的所出書籍的數(shù)目,注意刪除重復(fù)元素。List<Author> authors = getAuthors();long count = authors.stream().flatMap(author -> author.getBooks().stream()).distinct().count();System.out.println(count);

max&min

可以用來(lái)或者流中的最值。

例子:

分別獲取這些作家的所出書籍的最高分和最低分并打印。// 分別獲取這些作家的所出書籍的最高分和最低分并打印。//Stream<Author> -> Stream<Book> ->Stream<Integer> ->求值List<Author> authors = getAuthors();Optional<Integer> max = authors.stream().flatMap(author -> author.getBooks().stream()).map(book -> book.getScore()).max((score1, score2) -> score1 - score2);Optional<Integer> min = authors.stream().flatMap(author -> author.getBooks().stream()).map(book -> book.getScore()).min((score1, score2) -> score1 - score2);System.out.println(max.get());System.out.println(min.get());

collect

把當(dāng)前流轉(zhuǎn)換成一個(gè)集合。

例子:

獲取一個(gè)存放所有作者名字的List集合。// 獲取一個(gè)存放所有作者名字的List集合。List<Author> authors = getAuthors();List<String> nameList = authors.stream().map(author -> author.getName()).collect(Collectors.toList());System.out.println(nameList);獲取一個(gè)所有書名的Set集合。// 獲取一個(gè)所有書名的Set集合。List<Author> authors = getAuthors();Set<Book> books = authors.stream().flatMap(author -> author.getBooks().stream()).collect(Collectors.toSet());System.out.println(books);獲取一個(gè)Map集合,map的key為作者名,value為L(zhǎng)ist<Book>// 獲取一個(gè)Map集合,map的key為作者名,value為L(zhǎng)ist<Book>List<Author> authors = getAuthors();Map<String, List<Book>> map = authors.stream().distinct().collect(Collectors.toMap(author -> author.getName(), author -> author.getBooks()));System.out.println(map);

查找與匹配

anyMatch

可以用來(lái)判斷是否有任意符合匹配條件的元素,結(jié)果為boolean類型。

例子:

判斷是否有年齡在29以上的作家// 判斷是否有年齡在29以上的作家List<Author> authors = getAuthors();boolean flag = authors.stream().anyMatch(author -> author.getAge() > 29);System.out.println(flag);

allMatch

可以用來(lái)判斷是否都符合匹配條件,結(jié)果為boolean類型。如果都符合結(jié)果為true,否則結(jié)果為false。

例子:

判斷是否所有的作家都是成年人// 判斷是否所有的作家都是成年人List<Author> authors = getAuthors();boolean flag = authors.stream().allMatch(author -> author.getAge() >= 18);System.out.println(flag);

noneMatch

可以判斷流中的元素是否都不符合匹配條件。如果都不符合結(jié)果為true,否則結(jié)果為false

例子:

判斷作家是否都沒有超過(guò)100歲的。// 判斷作家是否都沒有超過(guò)100歲的。List<Author> authors = getAuthors();boolean b = authors.stream().noneMatch(author -> author.getAge() > 100);System.out.println(b);

findAny

獲取流中的任意一個(gè)元素。該方法沒有辦法保證獲取的一定是流中的第一個(gè)元素。

例子:

獲取任意一個(gè)年齡大于18的作家,如果存在就輸出他的名字// 獲取任意一個(gè)年齡大于18的作家,如果存在就輸出他的名字List<Author> authors = getAuthors();Optional<Author> optionalAuthor = authors.stream().filter(author -> author.getAge()>18).findAny();optionalAuthor.ifPresent(author -> System.out.println(author.getName()));

findFirst

獲取流中的第一個(gè)元素。

例子:

獲取一個(gè)年齡最小的作家,并輸出他的姓名。// 獲取一個(gè)年齡最小的作家,并輸出他的姓名。List<Author> authors = getAuthors();Optional<Author> first = authors.stream().sorted((o1, o2) -> o1.getAge() - o2.getAge()).findFirst();first.ifPresent(author -> System.out.println(author.getName()));

reduce歸并

對(duì)流中的數(shù)據(jù)按照你指定的計(jì)算方式計(jì)算出一個(gè)結(jié)果。(縮減操作)reduce的作用是把stream中的元素給組合起來(lái),我們可以傳入一個(gè)初始值,它會(huì)按照我們的計(jì)算方式依次拿流中的元素和初始化值進(jìn)行計(jì)算,計(jì)算結(jié)果再和后面的元素計(jì)算。reduce兩個(gè)參數(shù)的重載形式內(nèi)部的計(jì)算方式如下:T result = identity; for (T element : this stream)result = accumulator.apply(result, element) return result;其中identity就是我們可以通過(guò)方法參數(shù)傳入的初始值,accumulator的apply具體進(jìn)行什么計(jì)算也是我們通過(guò)方法參數(shù)來(lái)確定的。

例子:

使用reduce求所有作者年齡的和// 使用reduce求所有作者年齡的和List<Author> authors = getAuthors();Integer sum = authors.stream().distinct().map(author -> author.getAge()).reduce(0, (result, element) -> result + element);System.out.println(sum);使用reduce求所有作者中年齡的最大值// 使用reduce求所有作者中年齡的最大值List<Author> authors = getAuthors();Integer max = authors.stream().map(author -> author.getAge()).reduce(Integer.MIN_VALUE, (result, element) -> result < element ? element : result);System.out.println(max);使用reduce求所有作者中年齡的最小值// 使用reduce求所有作者中年齡的最小值List<Author> authors = getAuthors();Integer min = authors.stream().map(author -> author.getAge()).reduce(Integer.MAX_VALUE, (result, element) -> result > element ? element : result);System.out.println(min);reduce一個(gè)參數(shù)的重載形式內(nèi)部的計(jì)算boolean foundAny = false;T result = null;for (T element : this stream) {if (!foundAny) {foundAny = true;result = element;}elseresult = accumulator.apply(result, element);}return foundAny ? Optional.of(result) : Optional.empty();如果用一個(gè)參數(shù)的重載方法去求最小值代碼如下:// 使用reduce求所有作者中年齡的最小值List<Author> authors = getAuthors();Optional<Integer> minOptional = authors.stream().map(author -> author.getAge()).reduce((result, element) -> result > element ? element : result);minOptional.ifPresent(age-> System.out.println(age));

注意事項(xiàng)

  • 惰性求值(如果沒有終結(jié)操作,沒有中間操作是不會(huì)得到執(zhí)行的)
  • 流是一次性的(一旦一個(gè)流對(duì)象經(jīng)過(guò)一個(gè)終結(jié)操作后。這個(gè)流就不能再被使用)
  • 不會(huì)影響原數(shù)據(jù)(我們?cè)诹髦锌梢远鄶?shù)據(jù)做很多處理。但是正常情況下是不會(huì)影響原來(lái)集合中的元素的。這往往也是我們期望的)

總結(jié)

以上是生活随笔為你收集整理的Stream流常用操作(超全+实例)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。