java mapreduce 实例_java8-3-LambdaMapReduce例子

public class LambdaMapReduce {

private static List 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 list = users.parallelStream().filter(p -> p.age > 12)

.collect(Collectors.toList());

System.out.println("age > 12: ");

System.out.println(list);

//按性别统计用户数

Map map = users.parallelStream().collect(

Collectors.groupingBy(User::getGender,

Collectors.summingInt(p -> 1)));

System.out.println("sex -> num");

System.out.println(map);

//按性别获取用户名称

Map> map2 = users.stream()

.collect(

Collectors.groupingBy(

User::getGender,

Collectors.mapping(User::getName,

Collectors.toList())));

System.out.println("sex -> name");

System.out.println(map2);

//按性别求年龄的总和

Map map3 = users.stream().collect(

Collectors.groupingBy(User::getGender,

Collectors.reducing(0, User::getAge, Integer::sum)));

System.out.println("sex -> ageSum");

System.out.println(map3);

//按性别求年龄的平均值

Map map4 = users.stream().collect(

Collectors.groupingBy(User::getGender,

Collectors.averagingInt(User::getAge)));

System.out.println("sex -> ageAvg");

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);

}

}

class User{

publicintid;

public String name;

publicintage;

public Sex gender;

public User(int id, String name, int age, Sex gender) {

this.id=id;

this.name=name;

this.age=age;

this.gender=gender;

}

public int getId() {

returnid;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

returnname;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

returnage;

}

public void setAge(int age) {

this.age = age;

}

publicenumSex{

FEMALE,

MALE;

}

public Sex getGender() {

returngender;

}

public void setGender(Sex gender) {

this.gender = gender;

}

}

class Averager implements IntConsumer

{

private int total = 0;

private int count = 0;

public double average() {

return count > 0 ? ((double) total)/count : 0;

}

public void accept(int i) { total += i; count++; }

public void combine(Averager other) {

total += other.total;

count += other.count;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值