java8 如何進行stream reduce,collection操作
阿新 • • 發佈:2020-08-09
一、概念介紹
在java8JDK包含許多聚合操作(如平均值,總和,最小,最大,和計數),返回一個計算流stream的聚合結果。這些聚合操作被稱為聚合操作。JDK除返回單個值的聚合操作外,還有很多聚合操作返回一個collection集合例項。很多的reduce操作執行特定的任務,如求平均值或按類別分組元素。
JDK提供的通用的聚合操作:Stream.reduce,Stream.collection
注意:本文將reduction operations翻譯為聚合操作,因為reduction operations通常用於匯聚統計。
兩者的區別:
Stream.reduce,常用的方法有average,sum,min,max, andcount,返回單個的結果值,並且reduce操作每處理一個元素總是建立一個新值
Stream.collection與stream.reduce方法不同,Stream.collect修改現存的值,而不是每處理一個元素,建立一個新值
二、原始碼
package lambda;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class LambdaMapReduce {
private static List<User> users = Arrays.asList(
new User(1, "張三", 12,User.Sex.MALE),
new User(2, "李四", 21, User.Sex.FEMALE),
new User(3,"王五", 32, User.Sex.MALE),
new User(4, "趙六", 32, User.Sex.FEMALE));
public static void main(String[] args) {
reduceAvg();
reduceSum();
//與stream.reduce方法不同,Stream.collect修改現存的值,而不是每處理一個元素,建立一個新值
//獲取所有男性使用者的平均年齡
Averager averageCollect = users.parallelStream()
.filter(p -> p.getGender() == User.Sex.MALE)
.map(User::getAge)
.collect(Averager::new, Averager::accept, Averager::combine);
System.out.println("Average age of male members: "
+ averageCollect.average());
//獲取年齡大於12的使用者列表
List<User> list = users.parallelStream().filter(p -> p.age > 12)
.collect(Collectors.toList());
System.out.println(list);
//按性別統計使用者數
Map<User.Sex, Integer> map = users.parallelStream().collect(
Collectors.groupingBy(User::getGender,
Collectors.summingInt(p -> 1)));
System.out.println(map);
//按性別獲取使用者名稱稱
Map<User.Sex, List<String>> map2 = users.stream()
.collect(
Collectors.groupingBy(
User::getGender,
Collectors.mapping(User::getName,
Collectors.toList())));
System.out.println(map2);
//按性別求年齡的總和
Map<User.Sex, Integer> map3 = users.stream().collect(
Collectors.groupingBy(User::getGender,
Collectors.reducing(0, User::getAge, Integer::sum)));
System.out.println(map3);
//按性別求年齡的平均值
Map<User.Sex, Double> map4 = users.stream().collect(
Collectors.groupingBy(User::getGender,
Collectors.averagingInt(User::getAge)));
System.out.println(map4);
}
// 注意,reduce操作每處理一個元素總是建立一個新值,
// Stream.reduce適用於返回單個結果值的情況
//獲取所有使用者的平均年齡
private static void reduceAvg() {
// mapToInt的pipeline後面可以是average,max,min,count,sum
double avg = users.parallelStream().mapToInt(User::getAge)
.average().getAsDouble();
System.out.println("reduceAvg User Age: " + avg);
}
//獲取所有使用者的年齡總和
private static void reduceSum() {
double sum = users.parallelStream().mapToInt(User::getAge)
.reduce(0, (x, y) -> x + y); // 可以簡寫為.sum()
System.out.println("reduceSum User Age: " + sum);
}
}
三、參考
http://docs.oracle.com/javase/tutorial/collections/streams/reduction.html
來源:站長資訊