java8_stream操作

版权声明:dream_on_sakura_rain https://blog.csdn.net/qq_32112175/article/details/81987289
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author licunzhi
 * @desc 描述功能
 * @date 2018-08-23
 */
public class Stream {
    public static void main(String[] args) {

        /**
         * 数据初始化部分
         */

        List<User> users = new ArrayList<>();

        User user = new User("1", "licunzhi", 1, 23, 62.12);
        users.add(user);
        user = new User("2", "xiaomeimei", 2, 23, 52.12);
        users.add(user);
        user = new User("3", "xiaojizai", 1, 24, 22.12);
        users.add(user);
        user = new User("4", "xiaozhuti", 2, 24, 22.12);
        users.add(user);
        user = new User("5", "dajizai", 1, 25, 32.12);
        users.add(user);
        user = new User("6", "dazhuti", 2, 25, 32.12);
        users.add(user);


        List<User> users_compare = new ArrayList<>();

        user = new User("1", "AAA", 1, 23, 12.12);
        users_compare.add(user);
        user = new User("2", "xiaomeimei", 2, 23, 12.12);
        users_compare.add(user);
        user = new User("3", "BBB", 1, 24, 22.12);
        users_compare.add(user);
        user = new User("4", "xiaozhuti", 2, 24, 22.12);
        users_compare.add(user);
        user = new User("5", "CCC", 1, 25, 32.12);
        users_compare.add(user);
        user = new User("6", "dazhuti", 2, 25, 32.12);
        users_compare.add(user);


        /*
        * 进行分组筛选(根据性别筛选)
        * */
        System.out.println("进行单层分组筛选操作");
        Map<Integer, List<User>> groupMap = users.stream().collect(Collectors.groupingBy(User::getSex));
        groupMap.forEach((k, v) -> {
            System.out.println(k);
            v.forEach(System.out::println);
        });
        /*
        * 多层分组
        * Map<k, v>
        *        |------- Map<k, v>
        * */
        System.out.println("进行双层分组筛选操作");
        Map<Integer, Map<String, List<User>>> doubleGroupMap = users.stream().collect(Collectors
                        .groupingBy(User::getSex, Collectors.groupingBy(User::getName, Collectors.toList())));
        doubleGroupMap.forEach((k, v) -> {
            System.out.println(k);
            v.forEach((k_in, v_in) -> {
                System.out.println(k_in);
                System.out.println(v_in);
            });
        });

        /*
         * 进行快速数学计算操作(salary)
        * sum()
        * max()
        * average()
        * */
        System.out.println("进行快速数学计算操作");
        double sum_value = users.stream().mapToDouble(User::getSalary).sum();
        System.out.println(sum_value);
        double max_value = users.stream().mapToDouble(User::getSalary).max().getAsDouble();
        System.out.println(max_value);
        double ave_value = users.stream().mapToDouble(User::getSalary).average().getAsDouble();
        System.out.println(ave_value);
        //定制化计算方式的初始化和计算函数方式
        int totalAge = users.stream().mapToInt(User::getAge).reduce(100, (a, b) -> a + b);
        System.out.println(totalAge);
        /*直接使用map函数对对象进行修改*/
        System.out.println("使用map方法对对象进行信息填充或者是转换");
        List<User> userListConvert = users.stream().map(u -> {
            User userMap = new User();
            userMap.setName(u.getName());
            return userMap;
        }).collect(Collectors.toList());
        userListConvert.forEach(System.out::println);
        /*
         * 集合分组进行分组计算
         * */
        System.out.println("使用groupingBy+reducing分组计算");
        Map<Integer, Integer> groupReduceMap = users.stream().collect(Collectors
                        .groupingBy(User::getSex, Collectors.reducing(-1000, User::getAge, Integer::sum)));
        //还可以使用:Integer::max Integer::min
        groupReduceMap.forEach((k, v) -> {
            System.out.println(k);
            System.out.println(v);
        });
        /*
         * 使用集合内置操作快捷方法
         * */
        System.out.println("使用groupingBy+averagingDouble分组计算");
        Map<Integer, Double> groupCollectorsAvgMap = users.stream()
                        .collect(Collectors.groupingBy(User::getSex, Collectors.averagingDouble(User::getAge)));
        //还可以使用 averagingInt averagingLong summingInt summingLong summingDouble minBy maxBy
        groupCollectorsAvgMap.forEach((k, v) -> {
            System.out.println(k);
            System.out.println(v);
        });

        /*
         * 过滤操作(filter)
         * */
        System.out.println("过滤操作(filter)");
        List<User> user2 = users.stream().filter(u -> u.getSex() == 1).collect(Collectors.toList());
        user2.forEach(System.out::println);

        //统计筛选结果的数量
        long count = users.stream().filter(u -> u.getSex() == 2).count();
        System.out.println(count);

        //介绍较为复杂的筛选操作,比较两个list,筛选指定的相同属性的结果(users,users_compare----甄选字段name)
        /*
         * 需要注意的是外层的集合设置需要是大范围的list,这样可以是的所有的操作结果都可以遍历到
         * */
        List<User> result_users = users.stream()
                        .filter(u -> users_compare.stream().anyMatch(uc -> Objects.equals(u.getName(), uc.getName())))
                        .collect(Collectors.toList());
        result_users.forEach(System.out::println);
        /*
         * 上面筛选函数使用的是自带的(anyMatch),如果你想使用指定统计条件你可以这么写
         * users.stream().filter(u -> users_compare.stream().filter(uc -> Objects.equals(u.getName(), uc.getName()))
                        .count() > 0).collect(Collectors.toList());
         *
         * 其中自带函数还有:
         * anyMatch :满足匹配
         * allMatch :所有匹配
         * noneMatch :不匹配的
         * */

        /*排序操作*/
        System.out.println("默认排序操作(但是User类需要实现Comparator)否则会出现异常");
        /*List<User> sortedUsers = users.stream().sorted().collect(Collectors.toList());
        sortedUsers.forEach(System.out::println);*/
        System.out.println("不需要类实现Comparator就可以实现定制化排序");
        List<User> sortedUsers = users.stream().sorted(Comparator.comparingDouble(User::getSalary)).collect(Collectors.toList());
        sortedUsers.forEach(System.out::println);
    }
}

github项目地址:https://github.com/licunzhi/dream_on_sakura_rain/tree/master/java_stream_demo

猜你喜欢

转载自blog.csdn.net/qq_32112175/article/details/81987289