Java8 如何進(jìn)行stream reduce,collection操作
在java8 JDK包含許多聚合操作(如平均值,總和,最小,***,和計(jì)數(shù)),返回一個(gè)計(jì)算流stream的聚合結(jié)果。這些聚合操作被稱為聚合操作。 JDK除返回單個(gè)值的聚合操作外,還有很多聚合操作返回一個(gè)collection集合實(shí)例。很多的reduce操作執(zhí)行特定的任務(wù),如求平均值或按類別分 組元素。
JDK提供的通用的聚合操作:Stream.reduce,Stream.collection
注意:本文將reduction operations翻譯為聚合操作,因?yàn)閞eduction operations通常用于匯聚統(tǒng)計(jì)。
兩者的區(qū)別:
Stream.reduce,常用的方法有average, sum, min, max, and count,返回單個(gè)的結(jié)果值,并且reduce操作每處理一個(gè)元素總是創(chuàng)建一個(gè)新值
Stream.collection與stream.reduce方法不同,Stream.collect修改現(xiàn)存的值,而不是每處理一個(gè)元素,創(chuàng)建一個(gè)新值
- 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修改現(xiàn)存的值,而不是每處理一個(gè)元素,創(chuàng)建一個(gè)新值
- //獲取所有男性用戶的平均年齡
- 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);
- //按性別統(tǒng)計(jì)用戶數(shù)
- 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操作每處理一個(gè)元素總是創(chuàng)建一個(gè)新值,
- // Stream.reduce適用于返回單個(gè)結(jié)果值的情況
- //獲取所有用戶的平均年齡
- 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); // 可以簡(jiǎn)寫為.sum()
- System.out.println("reduceSum User Age: " + sum);
- }
- }
三、參考
http://docs.oracle.com/javase/tutorial/collections/streams/reduction.html
本文鏈接:http://my.oschina.net/cloudcoder/blog/215169