Java学习:Stream流的入门使用,通过例子来说明使用。

使用Stream流是目前Java开发一个必不可少的开发技能
– 但是在一段时间没有使用的情况下又容易忘记,所以也是将一些特别基础的用法先记录下来,方便学习查看等。
– 通过例子来举例说明用法,对于个人来说更有利于学习查看,在学习工作中,有类似的需求时,就可以举一反三、照葫芦画瓢来进行的编码。

如果有错误的、有可以优化的地方,欢迎指出一起学习

0、这边先准备一些基本的数据 - 员工对象
public class Employee {
    Integer employeeId;
    String employeeName;
    Integer age;
    char gender;
    Date entryTime; //入职时间
    Date leaveTime; //离职时间
    //构造函数、getset方法、toString等自行补充

将对象数据存放到List中

public class EmployeeServer {
    static List<Employee> employeeList = new ArrayList<>();
    static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    static {
        try {
            //离职时间为null 代表在职
            employeeList.add(new Employee(1,"tom",25,'男',format.parse("2012-05-12"),null));
            employeeList.add(new Employee(2,"piece",35,'男',format.parse("2013-05-12"),null));
            employeeList.add(new Employee(3,"nami",19,'女',format.parse("2014-05-12"),format.parse("2023-05-12")));
            employeeList.add(new Employee(4,"frank",21,'男',format.parse("2015-05-12"),null));
            employeeList.add(new Employee(5,"blue",22,'女',format.parse("2016-05-12"),format.parse("2020-05-12")));
            employeeList.add(new Employee(6,"joe",28,'女',format.parse("2017-05-12"),format.parse("2022-05-12")));
            employeeList.add(new Employee(7,"jason",36,'男',format.parse("2018-05-12"),format.parse("2019-05-12")));
            employeeList.add(new Employee(6,"hale",31,'女',format.parse("2017-05-12"),null));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    //工具方法 - 获取日期
    private static Date getYearDate(int year) {
        try {
            return format.parse(year + "-01-01");
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }
    ...........
    等下Stream流操作的方法均写在这里12345.........
    ...........
    public static void main(String[] args) throws ParseException {
        // byGender();
        // getMan();
        // getManAndAgeGt30();
        // getAgeGt30And25();
        // getWomenAvgAge();
        // getAvgAgeByGender();
        // getOnTheJobCount();
        // getEntry14();
        // getNameConO();
        // getAgeList();
        // getOnTheJobNameChar();
        // getTotalAge();
        // printAddTenButXXX();
        // ........将需要的方法名写在这里,不需要的注释即可
    }
}

1、根据性别分类
    public static void byGender(){
        Map<Character, List<Employee>> collect =
                employeeList.stream()
                .collect(Collectors.groupingBy(it -> it.gender));
        System.out.println(collect);
    }
2、获取所有性别为男的
   public static void getMan(){
        employeeList.stream()
        .filter(it -> it.getGender() == '男')
        .collect(Collectors.toList())
        .forEach(System.out::println);  //逐个输出
    }
3、获取男性且年龄大于30
    public static void getManAndAgeGt30(){
        List<Employee> collect = employeeList.stream()
        .filter(it -> it.gender == '男' && it.age > 30)
        .collect(Collectors.toList());
        System.out.println(collect);
    }
4、获取男性且年龄大于30和女性年龄大于25的
    public static void getAgeGt30And25(){
        employeeList.stream()
                .filter(it -> (it.gender == '男' && it.age > 30) || (it.gender == '女' && it.age > 25))
                .collect(Collectors.toList()).forEach(System.out::println);
    }
5、获取女性的平均年龄
    public static void getWomenAvgAge(){
        Double avgAge = employeeList.stream()
        .filter(it -> it.getGender() == '女')
        .collect(Collectors.averagingDouble(it -> it.age));
        System.out.println(avgAge);
    }
6、获取各个性别的平均年龄
    public static void getAvgAgeByGender(){
        employeeList.stream()
        .collect(Collectors.groupingBy(it -> it.gender,
                Collectors.averagingDouble(it -> it.age)))
                .forEach((k,v) -> System.out.println(k+":"+v));
    }
7、获取在职员工的人数
    //获取在职员工的人数
    public static void getOnTheJobCount(){
        int size = employeeList.stream()
        .filter(it -> it.leaveTime == null)
        .collect(Collectors.toList()).size();
        System.out.println(size);

        long count = employeeList.stream()
        .filter(it -> it.leaveTime == null)
        .count();
        System.out.println(count);
    }

8、获取在2014年后入职且当前未离职的员工
    public static void getEntry14(){
        employeeList.stream()
                .filter(it -> it.entryTime.after(getYearDate(2014)) && it.leaveTime == null)
                .collect(Collectors.toList())
                .forEach(System.out::println);
    }
        //获取日期
    private static Date getYearDate(int year){
        try {
            return format.parse(year+"-01-01");
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }
9、获取姓名里面包括字母o的员工
 public static void getNameConO(){
        employeeList.stream()
        .filter(it -> it.employeeName.contains("o"))
        .collect(Collectors.toList()).forEach(System.out::println);
    }
10、获取所有员工的年龄,提取为一个独立的年龄列表
    public static void getAgeList(){
        List<Integer> list = employeeList.stream()
                .mapToInt(it -> it.age) // 将每个Employee对象映射为年龄值的IntStream
                .boxed()      //将IntStream转化为Stream<Integer>
                .collect(Collectors.toList());

        System.out.println(list);
    }

11、获取在职员工的姓名字母,提取为一个独立的列表
    public static void getOnTheJobNameChar(){
        List<String> list = employeeList.stream()
                .filter(it -> it.leaveTime == null)
                .flatMap(it -> it.employeeName.chars().mapToObj(c -> (char) c))//使用flatMap方法将每个员工的姓名映射为字符流,使用mapToObj将每个字符映射为Char
                .distinct()  //去重
                .map(it -> it.toString())   //map(Object::toString)
                .collect(Collectors.toList());
        System.out.println(list);
    }

12、获取员工年龄的总和
    public static void getTotalAge(){
        Integer totalAge = employeeList.stream()
                .map(Employee::getAge)
                .reduce(0, Integer::sum);
        System.out.println(totalAge);
    }
13、打印出每个员工加10岁后的年龄数据,但是最终输出到列表必须是原年龄
public static void printAddTenButXXX(){
    List<Integer> list = employeeList.stream()
            .map(it -> it.age) // Employee::getAge
            .peek(it -> {   //适合用于日志记录
                it = it + 10;
                System.out.println(it);
            })
            .collect(Collectors.toList());
    System.out.println(list);
}
14、随机获取一个在职的和一个离职的员工
public static void getRandomEmployee() {
        // 1. 获取在职员工列表
        List<Employee> onJobEmployees = employeeList.stream()
                .filter(employee -> employee.getLeaveTime() == null)
                .collect(Collectors.toList());
        // 2. 获取离职员工列表
        List<Employee> offJobEmployees = employeeList.stream()
                .filter(employee -> employee.getLeaveTime() != null)
                .collect(Collectors.toList());

        Stream.of(onJobEmployees.get(new Random().nextInt(onJobEmployees.size()))
                ,offJobEmployees.get(new Random().nextInt(onJobEmployees.size())))
                .collect(Collectors.toMap(
                        it -> it.leaveTime == null ? "离职":"在职",    //作为key
                        it -> it                                      //作为value
                )).forEach((k,v) -> System.out.println(k+":"+v));
    }
15、单纯的转化为一个Map
//单纯转化为Map
public static void toMap(){
    Map<Integer, Employee> collect = employeeList.stream().collect(Collectors.toMap(it -> it.employeeId, employee -> employee)); //两个参数分别为key和value

    collect.forEach((k,v)-> System.out.println(k+":"+v));
}
16、转化为Map后,将value对象中leaveTime为null的统一设置为今天
//转化为Map后,将value对象中leaveTime为null的统一设置为今天
public static void toMapAndSetLeaveTime(){
        Map<Integer, Employee> map = employeeList.stream()
                .collect(Collectors.toMap(
                        it -> it.employeeId,
                        employee -> {
                            Employee updateEmployee = employee;
                            if (updateEmployee.getLeaveTime() == null || updateEmployee.getLeaveTime().equals("")) {
                                updateEmployee.setLeaveTime(new Date());
                            }
                            return updateEmployee;
                        }));
        map.forEach((k,v)-> System.out.println(k+":"+v));
}

17、将employeeList转化为List<Map<EmployeeId,Employee>>
//将employeeList转化为List<Map<EmployeeId,Employee>>
public static void toListMap(){
    // 使用 Stream 流操作
       List<Map<Integer, Employee>> resultMapList = employeeList.stream()
           .map(employee -> {
                // Map.of(employee.getEmployeeId(), employee)) 使用Java9+
                Map<Integer, Employee> map = new HashMap<>();
                map.put(employee.getEmployeeId(), employee);
                return map;
            })
            .collect(Collectors.toList());

       // 打印转换后的 List<Map<StudentId, Student>>
       resultMapList.forEach(System.out::println);
}

执行的话就main去调用各个方法就行了
截止目前,对这堆数据暂时想出来的问题大概就这些
后续有新的想法等再进行添加。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值