使用Stream流是目前Java开发一个必不可少的开发技能
– 但是在一段时间没有使用的情况下又容易忘记,所以也是将一些特别基础的用法先记录下来,方便学习查看等。
– 通过例子来举例说明用法,对于个人来说更有利于学习查看,在学习工作中,有类似的需求时,就可以举一反三、照葫芦画瓢来进行的编码。
如果有错误的、有可以优化的地方,欢迎指出一起学习
文章目录
- 0、这边先准备一些基本的数据 - 员工对象
- 1、根据性别分类
- 2、获取所有性别为男的
- 3、获取男性且年龄大于30
- 4、获取男性且年龄大于30和女性年龄大于25的
- 5、获取女性的平均年龄
- 6、获取各个性别的平均年龄
- 7、获取在职员工的人数
- 8、获取在2014年后入职且当前未离职的员工
- 9、获取姓名里面包括字母o的员工
- 10、获取所有员工的年龄,提取为一个独立的年龄列表
- 11、获取在职员工的姓名字母,提取为一个独立的列表
- 12、获取员工年龄的总和
- 13、打印出每个员工加10岁后的年龄数据,但是最终输出到列表必须是原年龄
- 14、随机获取一个在职的和一个离职的员工
- 15、单纯的转化为一个Map
- 16、转化为Map后,将value对象中leaveTime为null的统一设置为今天
- 17、将employeeList转化为List<Map<EmployeeId,Employee>>
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流操作的方法均写在这里1、2、3、4、5.........
...........
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去调用各个方法就行了
截止目前,对这堆数据暂时想出来的问题大概就这些
后续有新的想法等再进行添加。