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

歡迎訪問 生活随笔!

生活随笔

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

java

详解Java8中流(Stream)的使用

發布時間:2025/1/21 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解Java8中流(Stream)的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章列表

      • 一、回憶Lambda表達式
      • 二、什么是流
        • 1、流只能遍歷一次
        • 2、外部迭代和內部迭代
      • 三、流操作
        • 1、謂詞篩選
        • 2、篩選各異元素
        • 3、截段流
        • 4、跳過元素
        • 5、map和flatMap
        • 6、查找和匹配
        • 7、歸約reduce

寫在前面:
我是「境里婆娑」。我還是從前那個少年,沒有一絲絲改變,時間只不過是考驗,種在心中信念絲毫未減,眼前這個少年,還是最初那張臉,面前再多艱險不退卻。
寫博客的目的就是分享給大家一起學習交流,如果您對 Java感興趣,可以關注我,我們一起學習。

前言:還沒接觸過流的同學可以深入研究下此篇文章,讓你在寫代碼過程中可以讓你達到事半功倍效果。

一、回憶Lambda表達式

在學習流之前,我們先回憶一下Lambda表達式和函數式接口

使用 案例lambda例子對應函數式接口
布爾表達式(List< String> list -> list.isEmpty())Predicate<(List< String>>
創建對象() -> new Car()Supplier< Car>
消費一個對象(Car car) -> System.out.println(car.getColor)Consumer< Car>
從一個對象提取(String s) -> s.length()Function< String,Integer>
合并兩個值(int a,int b) ->a*bIntBinaryOperator
比較兩個值對象(Apple a1,Apple a2) -> a1.getWeigth().compareTo(a2.getWeigth())Comparator< Apple>或BiFunction< Apple,Apple,Integer>

二、什么是流

流是Java 新的API,它允許你以聲明性方式處理數據集合。可以把流看作是遍歷數據集合的高級迭代器。另外,流還可以透明的并行處理,無需寫任何多線程代碼。

public class Car {private String color;private String brand; }

例Java7之前,選出小汽車顏色代碼如下:

List<Car> cars = Arrays.asList(new Car("bule", "aodi"), new Car("red", "BMW"), new Car("white", "benw")); List<String> list = new ArrayList<>(); for (Car car : cars) {list.add(car.getColor()); }

例Java8之后可以如下:

List<String> collect = cars.stream().map(Car::getColor).collect(toList());

總結一下:Java8中的Stream API可以讓你寫出這樣的代碼

  • 聲明性 更簡潔,更易懂
  • 可復合,更靈活
  • 可并行,性能更好

看完上面代碼我們還是有疑惑,流到底是什么呢?簡短定義就是“從支持數據處理操作的源生成的元素序列”

  • 元素序列,就像集合一樣,流提供一個接口,可以訪問特定元素類型的有序值。集合是數據結構,目的是以特定的時間/空間復雜度存儲和訪問元素。但流的目的在于表達計算。總的來說集合講的是數據,而流講的是計算。
  • ,流會使用一個提供數據的源,如集合、 數組或輸入輸出資源。
  • 數據處理操作,流的數據處理功能支持類似數據庫的操作,以及函數式編程語言中的常用操作,如filter、map、reduce、find、match、sort。流操作可以順序執行,也可以并行執行。
  • 流水線,很多流操作本身會返回一個流,這樣多個操作就可以連接起來,形成一個大的流水線。
  • 內部迭代,與使用迭代器顯式迭代集合不同,流的迭代操作是在背后執行的。

1、流只能遍歷一次

流還有一個特點就是只能遍歷一次。遍歷完之后,我們說這個流已經被消費掉了。

2、外部迭代和內部迭代

使用Collection接口需要用戶去做迭代比如for-each,這稱為外部迭代。相反,Streams庫使用內部迭代。
采用內部迭代,項目可以透明地并行處理,或者用優化的順序進行處理,要是使用 Java 過去的外部迭代方法,這些優化都是很困難的

三、流操作

1、謂詞篩選

Streams接口支持filter方法,該操作會接受一個謂詞作為參數。

List<Car> aodi = cars.stream().filter(car -> car.getBrand().equals("aodi")).collect(toList());

2、篩選各異元素

流還支持一個叫distinct的方法,它會返回一個元素各異的流。以下代碼會篩選出所有基數。

List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4); numbers.stream() .filter(i -> i % 2 != 0) .distinct() .forEach(System.out::println);

3、截段流

流支持limit方法,該方法會返回一個不超過給定長度的流。所需要的長度作為參數傳遞給limit。

List<Car> aodi = cars.stream().filter(car -> car.getBrand().equals("aodi")).limit(3).collect(toList());

請注意limit也可以用在無序流上。比如源是一個Set,這種情況下,limit的結果不會以人物順序排列。

4、跳過元素

流還支持skip方法,返回一個扔掉了前n個元素的流。如果流中的元素不足n,則返回一個空流。注意。limit和skip是互補的。

List<Car> aodi = cars.stream().filter(car -> car.getBrand().equals("aodi")).skip(3).collect(toList());

5、map和flatMap

map和flatMap如何選用:假如你的集合流中包含子集合,那么使用flatMap可以返回該子集合的集合流

words.stream() .map(word -> word.split("")) .flatMap(Arrays::stream) .distinct() .collect(toList());

如果想詳細了解map和flatMap區別請看這篇文章:java8中map和flatMap區別

6、查找和匹配

另一個常見的數據處理套路是看看數據集中的某些元素是否匹配一個給定的屬性。

  • anyMatch,流中是否有一個元素能匹配到給定的謂詞
if(cars.stream().anyMatch(car -> car.getBrand().equals("aodi"))) { }
  • allMatch,是否匹配所有元素
if(cars.stream().allMatch(car -> car.getBrand().equals("aodi"))) { }
  • noneMatch,確保流中沒有任何元素與給定的謂詞匹配
if(cars.stream().noneMatch(car -> car.getBrand().equals("aodi"))) { }

allMatch、anyMatch、noneMatch都用到了我們所謂的短路,這就是大家熟悉java中的&&和||運算符。

  • findAny返回當前流中的任意元素。
Optional<Car> car = cars.stream().filter(car -> car.getBrand().equals("aodi")).findAny();
  • findFirst()查出第一個元素
Optional<Car> car = cars.stream().filter(car -> car.getBrand().equals("aodi")).findFirst();

findAny()和findFirst()都會返回一個Optional泛型的對象。

Optional 是一個容器類,代表一個值存在或不存在。Optional方法如下:

  • isPresent()將在Optional包含值的時候返回true。否則返回false
  • ifPresent()會在值存在的時候執行給定代碼塊。
  • get()會在值存在返回值。
  • orElse()會在值存在時返回值。否則返回一個默認值。

7、歸約reduce

reduce是一個終端操作,比如我們做求和操作。

int sum = numbers.stream().reduce(0, (a, b) -> a + b);

比如求最大值和最小值

Optional<Integer> min = numbers.stream().reduce(Integer::max); Optional<Integer> min = numbers.stream().reduce(Integer::min);

至此我們把流的基本操作都介紹完。下面我們總結一下哪些是中間操作哪些是終端操作。

———————————————————————————

如果喜歡這篇文章的話請關注我!

總結

以上是生活随笔為你收集整理的详解Java8中流(Stream)的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 午夜整容室 | 一级黄毛片| 一区二区国产欧美 | а√中文在线资源库 | 免费一级肉体全黄毛片 | 亚洲性激情 | 亚色视频| 女人18岁毛片| 成人在线视频免费观看 | 少妇网站在线观看 | 免费在线观看黄色av | 粉色视频网站 | 五月天色站| 免费看国产片在线观看 | 国产精品二区视频 | 奇米影视在线播放 | 日韩欧美亚洲精品 | 黑人和白人做爰 | 亚洲视频中文字幕在线观看 | 亚洲天堂男人天堂 | 国产精品毛片久久久 | 91成人精品视频 | 一本一道久久a久久精品综合 | sese欧美| 日一日干一干 | 人妻夜夜爽天天爽三区麻豆av网站 | 黑白配高清国语在线观看 | 亚洲偷怕 | 成人福利一区二区 | 久久天天干 | 国产a视频精品免费观看 | 4438全国成人免费 | 欧美 日韩 国产 高清 | 亚洲色精品三区二区一区 | 精品人妻av一区二区三区 | 国产亚洲精品成人av久久ww | 国产寡妇亲子伦一区二区三区四区 | 天天色影网 | 成人a在线观看 | 男操女视频网站 | 黑森林av凹凸导航 | 女同激情久久av久久 | 欧美成人一区二区视频 | 一区二区国产精品精华液 | 日韩一二三区视频 | 一本久久精品一区二区 | 精品视频国产 | 黄色动漫在线观看 | 初尝人妻少妇中文字幕 | 草久视频在线观看 | 性生交大片免费看女人按摩 | 精品欧美在线观看 | 国产视频一区三区 | 天天色天天干天天 | 蜜桃av色偷偷av老熟女 | 中文区中文字幕免费看 | 在线电影一区二区三区 | 欧美黑人一级 | 国产欧美一区二区三区鸳鸯浴 | 精品三级 | 亚洲美女性生活视频 | 在线天堂中文在线资源网 | 欧美一级片播放 | 亚洲永久精品ww.7491进入 | 毛片看| 久久久久久久 | free性欧美hd另类 | 日韩精品一卡二卡 | 精品国产大片大片大片 | 国产aaaaaa| 欧美日韩一级大片 | 性视频久久 | 国产精品主播一区二区 | 色中文字幕在线观看 | 麻豆影视在线播放 | 亚洲av毛片| 亚洲国产aⅴ成人精品无吗 日韩乱论 | 污片视频在线观看 | 99色播| 丝袜美腿亚洲一区二区图片 | 日本电影大尺度免费观看 | www毛片com| 九九综合 | 免费在线日本 | 最近中文字幕在线观看视频 | 一区二区三区视频免费视 | 亚洲 欧美 激情 另类 | 男人把女人捅爽 | 国产一区二区三区精品在线观看 | 又大又粗又爽18禁免费看 | 国产日韩欧美精品一区二区 | 放荡闺蜜高h苏桃情事h | 国产麻豆剧传媒精品国产 | 国产一区二区三区在线免费 | 天堂在线观看视频 | 精品欧美一区二区精品少妇 | 亚洲精品在线影院 | 正在播放老肥熟妇露脸 | av 一区二区三区 |