1. 程式人生 > 實用技巧 >Java 8 Stream API例項

Java 8 Stream API例項

一、開篇

  1. Stream?其實就是處理集合的一種形式,稱之為流,在Java8中被引入,可被Collection中的子類呼叫。
  2. 作用?簡化程式碼,提升你的開發效率。
  3. 不會?看完這篇你就能自己上手了!

二、例項

首先將你的集合處理成流,才可以使用此API。

Stream<String> stream = list.stream();

接下來建立一個String型別的List,便於測試。

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(7);
list.add(4);
list.add(6);

接下來展示具體引數使用方式。

  • filter 過濾

例:需要過濾出在集合中,大於5的數字的集合。

List<Integer> result = list.stream().filter(o -> o>5).collect(Collectors.toList());

filter內部使用的是lamda表示式,也是Java8的功能,o代表集合中每一個元素,o>5表示這個元素的值若大於5就返回true,就獲取結果。collect表示聚合,Collectors.toList()表示將結果聚合到一個List集合。

  • map 形成一個新物件

例:需要將集合內的元素全部轉換成String型別。

List<String> result = list.stream().map(o->String.valueOf(o)).collect(Collectors.toList());
  • sort 排序

例: 需要從小到大排序。

List<Integer> result = list.stream().sorted().collect(Collectors.toList());

例: 需要從大到小排序。

List<Integer> result = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
  • forEach 遍歷

例: 列印集合內每個元素。

list.stream().forEach(o->System.out.println(o));
list.forEach(o->System.out.println(o));
  • distinct 去除重複元素
List<Integer> result = list.stream().distinct().collect(Collectors.toList());
  • reduce 集合內運算

例: 計算集合中元素的和。

Integer sum = list.stream().reduce(0, (i, j) -> i + j);

reduce中第一個引數為基數,即為初始值,i,j的定義為第一個和第二個運算元,i+j即為操作,此處為加法操作。

如果計算乘法,就不能設定初始值為0,因為0乘任何數都為0。

  • collect 聚合成Collection
  1. Collectors.toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper)
  2. Collectors.toList()
  3. Collectors.toSet()
  4. ...

例: 將list聚合成一個key為元素,value為“item”+元素的Map。

Map<Integer, String> map = list.stream().collect(Collectors.toMap(Function.identity(), o -> String.format("item%s", o)));

結果:{1=item1, 2=item2, 3=item3, 4=item4, 6=item6, 7=item7}

keyMapper表示設定為key的規則,valueMapper表示設定為value的規則。

Function.identity()表示當前本身元素。

  • groupBy 分組

Collectors.groupingBy(Function<? super T, ? extends K> classifier)

新建一個User實體,有姓名和年齡兩個欄位,並初始化一個集合便於測試。

List<User> list = new ArrayList<User>();
list.add(new User("與李", 18));
list.add(new User("CSDN", 19));
list.add(new User("han", 20));
list.add(new User("han", 21));

例: 需要把名字相同的實體提出來放在一起,形成一個List集合。

Map<String, List<User>> group = list.stream().collect(Collectors.groupingBy(User::getName));

結果:{han=[User [name=han, age=20], User [name=han, age=21]], CSDN=[User [name=CSDN, age=19]], 與李=[User [name=與李, age=18]]}

此處使用User實體的name屬性進行分組。

User::getName 與 o -> o.getName() 含義相同,兩者皆可傳入。

  • partitioningBy 分割槽

Collectors.partitioningBy(Predicate<? super T> predicate)

例: 分別統計年齡大於等於20和小於20的學生資訊

Map<Boolean, List<User>> partitioning = list.stream().collect(Collectors.partitioningBy(o -> o.getAge() >= 20));

結果:{false=[User [name=與李, age=18], User [name=CSDN, age=19]], true=[User [name=han, age=20], User [name=han, age=21]]}

可以看到返回結果是一個Map<Boolean, List>,利用partitioningBy後生成的map,有且僅有兩個元素,key固定為true和false,分別表示滿足條件的資訊和不不滿足條件的資訊。

三、結尾

此文列舉了Stream部分方法的使用,具體更多的方法需要自己去深入瞭解。通過熟悉使用Stream的api之後,你會對它的處理方式愛不釋手。