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

歡迎訪問 生活随笔!

生活随笔

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

java

java规约运算的signature_Java8笔记第七篇(Stream API 的操作-规约,收集 )

發布時間:2023/12/31 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java规约运算的signature_Java8笔记第七篇(Stream API 的操作-规约,收集 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深入 java8 第 07 篇 ( Stream API 的操作->規約,收集 )

一、Stream API 的操作步驟:

創建 Stream

中間操作

終止操作(終端操作 -> 規約,收集)

7.1 規約

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

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

7.1.1 準備測試數據

List emps = Arrays.asList(

new Employee(001, "Emma", 41, 20000, Status.FREE),

new Employee(002, "Mary", 39, 18000, Status.BUSY),

new Employee(003, "Allen", 33, 15000, Status.BUSY),

new Employee(004, "Olivia", 52, 32000, Status.FREE),

new Employee(005, "Natasha", 27, 13000, Status.BUSY),

new Employee(006, "Kevin", 25, 10000, Status.FREE),

new Employee(007, "Haivent", 25, 12000, Status.FREE)

);

List numList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

7.1.2 測試規約

@Test

public void test01(){

// 所有整數累加和

Integer reduce = numList.stream()

.reduce(0, (x,y)->x+y); System.out.println(reduce); // 所有薪資累加和 Optional reduce2 = emps.stream() .map(Employee::getSalary) .reduce(Double::sum); System.out.println("\n"+reduce2.get()); }

7.1.3 需求:統計所有姓名中 “A” 的出現次數

@Test

public void test02(){

Optional reduce = emps.stream()

.map(Employee::getName)

.flatMap(StreamAPI03::filterCharacter)

.map((e)->{ if(e.equals('A')){ return 1; }else{ return 0; } }) .reduce(Integer::sum); System.out.println(reduce.get()); } private static Stream filterCharacter(String str){ List list = new ArrayList<>(); for (Character ch : str.toCharArray()) { list.add(ch); } return list.stream(); }

7.2 收集

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

Collector 接口中方法的實現決定了如何對流執行收集操作(如收集到 List、 Set、 Map)。但是 Collectors 實用類提供了很多靜態方法,可以方便地創建常見收集器實例, 具體方法與實例如下:

方法與實例:

toList

List 把流中元素收集到List

toSet

Set 把流中元素收集到Set

toCollection

Collection 把流中元素收集到創建的集合

counting

Long 計算流中元素的個數

summingInt

Integer 對流中元素的整數屬性求和

averagingInt

Double 計算流中元素Integer屬性的平均值

summarizingInt

IntSummaryStatistics 收集流中Integer屬性的統計值。如:平均值

joining

String 連接流中每個字符串

maxBy

Optional 根據比較器選擇最大值

minBy

Optional 根據比較器選擇最小值

reducing

歸約產生的類型 從一個作為累加器的初始值開始,利用BinaryOperator與流中元素逐個結合,從而歸約成單個值

collectingAndThen

轉換函數返回的類型 包裹另一個收集器,對其結果轉換函數

groupingBy

Map> 根據某屬性值對流分組,屬性為K,結果為V

partitioningBy

Map> 根據true或false進行分區

7.2.1 測試收集 收集到集合

@Test

public void test03(){

List collect = emps.stream()

.map(Employee::getName)

.collect(Collectors.toList());

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

System.out.println();

Set collect2 = emps.stream()

.map(Employee::getName)

.collect(Collectors.toSet());

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

System.out.println();

ArrayList collect3 = emps.stream()

.map(Employee::getName)

.collect(Collectors.toCollection(ArrayList::new));

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

}

7.2.3 對流中元素進行計算

@Test

public void test04(){

Long collect = emps.stream()

.collect(Collectors.counting());

System.out.println("總員工數:"+collect);

Double collect2 = emps.stream()

.collect(Collectors.summingDouble(Employee::getSalary));

System.out.println("\n每月應發薪資總額:"+collect2);

Double collect3 = emps.stream()

.collect(Collectors.averagingDouble(Employee::getSalary));

System.out.println("\n員工平均月薪:"+collect3);

DoubleSummaryStatistics collect4 = emps.stream()

.collect(Collectors.summarizingDouble(Employee::getSalary));

System.out.println("\n員工中最低薪資為:"+collect4.getMin());

Optional collect5 = emps.stream()

.map(Employee::getSalary)

.collect(Collectors.maxBy(Double::compare));

System.out.println("\n員工中薪資最高為:"+collect5.get());

Optional collect6 = emps.stream()

.map(Employee::getSalary)

.collect(Collectors.minBy(Double::compare));

System.out.println("\n員工中薪資最低為:"+collect6.get());

Optional collect7 = emps.stream()

.map(Employee::getSalary)

.collect(Collectors.reducing(Double::sum));

System.out.println("\n員工每月薪資總共為:"+collect7.get());

}

7.2.4 將多個字符串連接成一個字符串

@Test

public void test05(){

String collect = emps.stream()

.map(Employee::getName)

.collect(Collectors.joining("-"));

System.out.println(collect);

}

7.2.5 對類型轉換為集合后,返回集合大小

@Test

public void test06(){

Integer collect = emps.stream()

.collect(Collectors.collectingAndThen(Collectors.toList(), List::size));

System.out.println(collect);

}

7.2.6 單級分組

@Test

public void test07(){

Map> collect = emps.stream()

.collect(Collectors.groupingBy(Employee::getStatus));

System.out.println(collect);

}

7.2.7 多級分組

@Test

public void test08(){

Map>> collect = emps.stream()

.collect(Collectors.groupingBy((e)->{ if(e.getStatus() == Status.FREE){ return "空閑"; }else{ return "繁忙"; } }, Collectors.groupingBy((e)->{ if(e.getSalary() > 10000){ return "大于 15000"; }else if (e.getSalary() > 20000){ return "大于 20000"; }else{ return "大于25000"; } }))); System.out.println(collect); }

根據員工狀態進行分區

@Test

public void test09(){

Map> collect = emps.stream()

.collect(Collectors.partitioningBy((e)->e.getStatus() == Status.FREE)); System.out.println(collect); }

總結

以上是生活随笔為你收集整理的java规约运算的signature_Java8笔记第七篇(Stream API 的操作-规约,收集 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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