zoukankan      html  css  js  c++  java
  • java8-3-LambdaMapReduce例子

     

    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("age > 12: "); 

            System.out.println(list); 

     

            //按性别统计用户数 

            Map<User.Sex, Integer> map = users.parallelStream().collect( 

                    Collectors.groupingBy(User::getGender, 

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

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

            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("sex -> name"); 

            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("sex -> ageSum"); 

            System.out.println(map3); 

             

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

            Map<User.Sex, Double> 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{

    public int id;

    public String name;

    public int age;

    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() {

    return id;

    }

    public void setId(int id) {

    this.id = id;

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    public int getAge() {

    return age;

    }

    public void setAge(int age) {

    this.age = age;

    }

     

    public enum Sex{

    FEMALE,

    MALE;

    }

     

    public Sex getGender() {

    return gender;

    }

     

    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;

        }

    }

  • 相关阅读:
    局域网文件实时同步工具
    SQLServer备份恢复助手(太强大了!)
    SQLServer 统计查询语句消耗时间
    如何将Sql server数据库中的模型图转化到Word中--并能够查看字段的属性信息
    创建Database Diagrams时遇到的问题
    bat 操作数据库(附加,分离,删除,还原)
    Bat 多个执行操作选择
    Redis Windows下查看版本号
    ThinkPHP 数据库操作(七) : 视图查询、子查询、原生查询
    ThinkPHP 数据库操作(六) : 查询事件、事务操作、监听SQL
  • 原文地址:https://www.cnblogs.com/zhaofeng555/p/8288724.html
Copyright © 2011-2022 走看看