知識總結-Java8 初識Stream

Stream是什麼?

Java 8 API添加的一個新的抽象稱為流Stream,以一種聲明的方式處理數據。使用一種類似用 SQL 語句從數據庫查詢數據的直觀方式來提供一種對Java 集合運算和表達的高階抽象。可以極大提高Java程序員的生產力,讓程序員寫出高效率、乾淨、簡潔的代碼。

操作符

說起Stream就不得不說操作符,那麼什麼是操作符呢?操作符就是對數據進行的一種處理工作,一道加工程序,Stream的操作符大體上分為兩種:中間操作符終止操作符。

中間操作符

對於數據流來說,中間操作符在執行制定處理程序後,數據流依然可以傳遞給下一級的操作符。

常見中間操作符包含8種

map轉換操作符,把比如A->B,這裡默認提供了轉int,long,double的操作符。

flatmap拍平操作比如把 int[]{2,3,4} 拍平 變成 2,3,4 也就是從原來的一個數據變成了3個數據,這裡默認提供了拍平成int,long,double的操作符。

  • limit 限流操作,比如數據流中有10個 我只要出前3個就可以使用。
  • distinct 去重操作,對重複元素去重,底層使用了equals方法。
  • filter 過濾操作,把不想要的數據過濾。
  • peek 挑出操作,如果想對數據進行某些操作,如:讀取、編輯修改等。
  • skip 跳過操作,跳過某些元素。
  • sorted(unordered) 排序操作,對元素排序,前提是實現Comparable接口,當然也可以自定義比較器。

終止操作符

數據經過中間加工操作,就輪到終止操作符上場了;終止操作符就是用來對數據進行收集或者消費的,數據到了終止操作這裡就不會向下流動了,終止操作符只能使用一次。

  • collect 收集操作,將所有數據收集起來,官方的提供的Collectors 提供了非常多收集器,Stream 的核心在於Collectors。
  • count 統計操作,統計最終的數據個數。
  • findFirst、findAny 查找操作,查找第一個、查找任何一個 返回的類型為Optional。
  • noneMatch、allMatch、anyMatch 匹配操作,數據流中是否存在符合條件的元素 返回值為bool 值。
  • min、max 最值操作,需要自定義比較器,返回數據流中最大最小的值。
  • reduce 規約操作,將整個數據流的值規約為一個值,count、min、max底層就是使用reduce。
  • forEach遍歷操作,這裡就是對最終的數據進行消費了。
  • toArray 數組操作,將數據流的元素轉換成數組。

代碼演練

說一百遍不如做一遍,下邊通過一些代碼演示具體的操作

1、map 可以看到 map 操作符要求輸入一個Function的函數是接口實例,功能是將T類型轉換成R類型的。

@Test

public void t1(){

Stream.of("apple","banana","orange")

.map(e->e.length()) //轉成單詞的長度 int

.forEach(e->System.out.println(e)); //輸出

}

@Test

public void t2()

{

Stream.of("apple","banana","orange")

.map(String::length) //轉成單詞的長度 int

.forEach(System.out::println);

}

2、 flatmap 作用就是將元素拍平拍扁 ,將拍扁的元素重新組成Stream,並將這些Stream 串行合併成一條Stream

@Test

public void t59()

{

Stream.of("a-b-c-d")

.flatMap(e->Stream.of(e.split("-")))

.forEach(e->System.out.println(e));

}

//輸出

a

b

c

d

3、limit 限制元素的個數,只需傳入 long 類型 表示限制的最大數

@Test

public void t59()

{

Stream.of(1,2,3,4,5,6)

.limit(3) //限制三個

.forEach(e->System.out.println(e)); //將輸出 前三個 1,2,3

}

4、distinct 將根據equals 方法進行判斷,如果要對自己自定義的bean 去重,則需要 重寫equals方法

@Test

public void t59()

{

Stream.of(1,2,3,1)

.distinct() //去重

.forEach(e->System.out.println(e));//將輸出 1,2,3

}

5、filter 對某些元素進行過濾,不符合篩選條件的將無法進入流的下游

@Test

public void t59()

{

Stream.of(1,2,3,6)

.filter(e->e>=3) //過濾小於3的

.forEach(e->System.out.println(e));//輸出3,6

}

6、peek 挑選 ,將元素挑選出來,可以理解為提前消費

@Test

public void t60()

{

Stream.of(new label(1,"1"),new label(2,"3"))

.peek(e->{e.setName("3");}) //每個name 修改為3

.forEach(e->System.out.println(e.name)); //輸出3,3

}

7、skip 跳過 元素

@Test

public void t60()

{

Stream.of(1,2,3)

.skip(2) //跳過前2個

.forEach(e->System.out.println(e)); //輸出的結果應該只有3

}

8、sorted 排序 底層依賴Comparable 實現,也可以提供自定義比較器

@Test

public void t60()

{

Stream.of(2,1,3)

.sorted()

.forEach(e->System.out.println(e));

}//輸出1,2,3

9、collect 收集,使用系統提供的收集器可以將最終的數據流收集到List,Set,Map等容器中。

@Test

public void t60()

{

List<integer> list = Stream.of(2,1,3)/<integer>

.collect(Collectors.toList());

System.out.println(list);//輸出2,1,3

}

10、count 統計數據流中的元素個數,返回的是long 類型

@Test

public void t60()

{

Long c = Stream.of(2,1,3)

.count();

System.out.println(c);//輸出 3

}

11、findFirst 獲取流中的第一個元素

@Test

public void t61()

{

Optional<integer> optionalInteger = Stream.of(2,1,3)/<integer>

.findFirst();

optionalInteger.ifPresent(e-> System.out.println(e));//輸出2

}

12、min 最小的一個,傳入比較器,也可能沒有(如果數據流為空)

@Test

public void t61()

{

Optional<integer> optionalInteger = Stream.of(2,1,3)/<integer>

.min((e,s)->e.compareTo(s));

optionalInteger.ifPresent(e-> System.out.println(e));// 輸出 1

}

13、reduce 是一個規約操作,所有的元素歸約成一個,比如對所有元素求和,乘啊等。

@Test

public void t61()

{

int sum = Stream.of(2,1,3)

.reduce(0,(e1,e2)->e1+e2);

System.out.println(sum);// 輸出6

}

其他的使用類似,下次詳細介紹函數式接口


分享到:


相關文章: