java8 stream常用操作

其实使用Java8很多年了,虽然一直也在用集合的stream操作,但是一直没有总结,今天就将stream的常用操作做一个总结,

至于stream的概念不会过多介绍,直接给出常用操作的案例,当然也是博主用的比较多的,后面有其他用法,也会补充进来

废话不多说,直接上代码:

package org.dudu.test;

import org.junit.Before;
import org.junit.Test;

import java.util.*;
import java.util.stream.Collectors;

/**
 * Java8 stream常用方法
 */
public class StreamTestDemo {

    private List<User> userList;


    @Before
    public void createUserList(){
        userList = new ArrayList<User>();
        User user1 = new User("张三",20);
        User user2 = new User("李四",25);
        User user3 = new User("王五",30);
        User user4 = new User("王麻子",32);
        User user5 = new User("老王",30);
        User user6 = new User("老李",25);
        User user7 = new User("老张",30);
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        userList.add(user4);
        userList.add(user5);
        userList.add(user6);
        userList.add(user7);
    }

    /**
     * 常规操作
     */
    //@Test
    public void streamCommon(){
        /**
         * Java8 stream常规用法
         */
        userList.stream().forEach((user) -> System.out.println(user.getAge()));
    }


    /**
     * 过滤
     */
    @Test
    public void streamFilter(){
        /**
         * 过滤操作,筛选出年龄30的用户,组装成一个list<user>
         */
        List<User> userMap = userList.stream().filter((user) -> user.getAge() == 30).collect(Collectors.toList());
        userMap.stream().forEach(System.out::println);
    }

    /**
     * 映射
     */
    @Test
    public void streamMap(){
        /**
         * 给其中每个用户的年龄增加5岁
         */
        List<User> userMap = userList.stream().map(user -> { user.setAge(user.getAge() + 5);return user;}).collect(Collectors.toList());
        userMap.stream().forEach(System.out::println);
    }

    /**
     * 映射
     */
    @Test
    public void streamMapsum(){
        /**
         * 计算给定用户的年龄和
         */
        int sumAges = userList.stream().mapToInt(User::getAge).sum();
        System.out.println(sumAges);
    }


    /**
     * 排序
     */
    @Test
    public void streamSort(){
        /**
         * 按照年龄从小到达排序(常规操纵)
         */
        List<User> userMap = userList.stream().sorted((user1,user2) -> {return user1.getAge() - user2.getAge();}).collect(Collectors.toList());
        userMap.stream().forEach(System.out::println);
    }



    /**
     * 排序
     */
    @Test
    public void streamSort1(){
        /**
         * 除了上面常规的排序外,
         * 我们也可以在sorted通过函数式处理
         */
        //默认从小到大
//        List<User> userMap = userList.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
        //从大到小
        List<User> userMap = userList.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
        userMap.stream().forEach(System.out::println);
    }

    /**
     * 统计
     */
    //@Test
    public void streamCollect(){
        /**
         * 实际当中我们需要聚合操作,比如将该示例中,将年龄相同的用户分组
         * 其实就是需要构造一个Map<Integer,List<User>>的数组结构,这个时候
         * 可以使用stream的collect中的分组操作
         */
        Map<Integer,List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getAge));
        userMap.keySet().stream().forEach((age) -> {
            System.out.println(age);
            System.out.println(Arrays.toString(userMap.get(age).toArray()));
        });
    }

    /**
     * 统计
     */
    //@Test
    public void streamCollect1(){
        /**
         * 工作中,有时候需要将某个集合中的属性,构造成一个集合
         * 比如本例中,需要将age属性构造成一个list<Integer>
         */
        List<Integer> ages = userList.stream().map(User::getAge).collect(Collectors.toList());
        System.out.println(Arrays.toString(ages.toArray()));
    }

    private class User {

        private String userName;

        private int age;

        public User(String userName, int age) {
            this.userName = userName;
            this.age = age;
        }

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString(){
            return this.getUserName() + ";" + this.getAge();
        }

    }


}

 

posted @ 2022-03-19 21:01  开放GIS  阅读(81)  评论(1编辑  收藏  举报