/**
* @author zbinyds
* @time 2022/10/18 16:39
*
* Stream Api可以高效的操作集合数据。
*/
public class Stream_ {
/**
* 常用Stream Api使用。
* stream():顺序流
* parallelStream():并行流
*/
@Test
public void ApiTest(){
// 获取测试数据
List employees = getListData();
// filter(过滤条件)。通过过滤条件筛选数据
// employees.stream().filter(employee -> employee.getAge() > 20).forEach(System.out::println);
// limit(n)。截取前n条数据
// employees.stream().limit(4).forEach(System.out::println);
// skip(n)。跳过前n条数据,截取之后的数据。
// employees.stream().skip(4).forEach(System.out::println);
// distinct()。去除重复数据,根据equals()和hashCode()进行去重
// employees.stream().distinct().forEach(System.out::println);
// map()映射,比如获取集合中对象的name属性值
// employees.stream().map(Employee::getName).forEach(System.out::println);
// sorted()自然排序/sorted(Comparator comparator)定制排序。比如按照集合中对象的age进行排序
// employees.stream().sorted((e1,e2) -> Integer.compare(e1.getAge(),e2.getAge())).forEach(System.out::println);
// allMatch(查找条件)。查找是否匹配所有元素,返回boolean。
// boolean b = employees.stream().allMatch(employee -> employee.getAge() > 20);
// System.out.println(b);
// anyMatch(查找条件)。查找是否至少匹配单个元素,返回boolean。
// boolean b = employees.stream().anyMatch(employee -> employee.getAge() == 24);
// System.out.println(b);
// noneMatch(查找条件)。查找是否没有匹配条件的元素,返回boolean。
// boolean b = employees.stream().noneMatch(employee -> employee.getName().contains("abc"));
// System.out.println(b);
// findFirst()。查找流中第一个元素
// Optional firstEmployee = employees.stream().findFirst();
// System.out.println(firstEmployee);
// findAny()。查找流中中任意一个元素
// Optional lastEmployee = employees.parallelStream().findAny();
// System.out.println(lastEmployee);
// count()。返回流中的元素个数
// long count = employees.stream().count();
// System.out.println(count);
// min(查找条件)/max(查找条件)。按照自定义条件来获取流中最小值/最大值...等等
// Optional maxSalary = employees.stream().map(Employee::getSalary).max(Double::compare);
// Optional minSalary = employees.stream().map(Employee::getSalary).min(Double::compare);
// System.out.println("集合中工资最高为 = " + maxSalary.get() + " ,最低为 = " + minSalary.get());
// forEach()。遍历流中所有元素
// employees.stream().forEach(System.out::println);
// reduce(计算规则)。归约,计算流中的元素值
// Double sumSalary = employees.stream().map(Employee::getSalary).reduce(0.0, Double::sum); // 方式一
// Optional sumSalary = employees.stream().map(Employee::getSalary).reduce((d1, d2) -> d1 + d2); // 方式二
// System.out.println(sumSalary);
// collect(类型)。将处理好的流,转换为list/set/collection类型
Set set = employees.stream().filter(e -> e.getName().contains("a")).collect(Collectors.toSet());
System.out.println(set);
}
static List getListData(){
ArrayList employees = new ArrayList<>();
employees.add(new Employee(1001,"Tom",24,6000.00));
employees.add(new Employee(1002,"Jack",55,17800.00));
employees.add(new Employee(1003,"Jerry",67,25000.00));
employees.add(new Employee(1004,"Marry",54,12000.00));
employees.add(new Employee(1005,"Lucy",33,6000.00));
employees.add(new Employee(1006,"Mary",37,6834.00));
employees.add(new Employee(1007,"Tory",17,3577.00));
employees.add(new Employee(1008,"Miss",49,7447.00));
employees.add(new Employee(1009,"GG",50,5200.00));
employees.add(new Employee(1009,"GG",50,5200.00));
employees.add(new Employee(1009,"GG",50,5200.00));
return employees;
}
}
// 测试员工类 Employee
class Employee{
private Integer id;
private String name;
private Integer age;
private Double salary;
public Employee() {
}
public Employee(Integer id, String name, Integer age, Double salary) {
this.id = id;
this.name = name;
this.age = age;
this.salary = salary;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return Objects.equals(id, employee.id) &&
Objects.equals(name, employee.name) &&
Objects.equals(age, employee.age) &&
Objects.equals(salary, employee.salary);
}
@Override
public int hashCode() {
return Objects.hash(id, name, age, salary);
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
}