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

        }

    }

  • 相关阅读:
    【数据结构】线性表&&顺序表详解和代码实例
    【智能算法】超详细的遗传算法(Genetic Algorithm)解析和TSP求解代码详解
    【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)
    【智能算法】迭代局部搜索(Iterated Local Search, ILS)详解
    10. js时间格式转换
    2. 解决svn working copy locked问题
    1. easyui tree 初始化的两种方式
    10. js截取最后一个斜杠后面的字符串
    2. apache整合tomcat部署集群
    1. apache如何启动
  • 原文地址:https://www.cnblogs.com/zhaofeng555/p/8288724.html
Copyright © 2020-2023  润新知