Stream API 优化代码

使用Java8中新特性Lambda表达式和流申明式处理数据集合,让代码更简洁

使用一个简单的员工类来学习使用方法

public class Employee {

        /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private int age;

    /**
     * 薪资
     */
    private double salary;

    /**
     * 部门
     */
    private String dept;

    public Employee(String name, int age, String dept, double salary) {
        this.name = name;
        this.age = age;
        this.dept = dept;
        this.salary = salary;
    }

    //...省略
}

测试集合(模拟数据查询出来的数据)

List<Employee> stuList = new ArrayList<>();
stuList.add(new Employee("小明", 18, "开发部", 2000.00));
stuList.add(new Employee("小红", 20, "开发部", 2100.00));
stuList.add(new Employee("小强", 25, "测试部", 2200.00));

年龄小于25岁的员工姓名按年龄排序

List<String> result = stuList.stream()
                //筛选出年龄小于25岁的员工
                .filter(stu -> stu.getAge() < 25)
                //根据年龄进行排序
                .sorted(comparing(Employee::getAge))
                //获取员工姓名
                .map(Employee::getName)
                //转换为List
                .collect(Collectors.toList());

按员工部门进行分类

Map<String, List<Employee>> deptEmployee = stuList.stream()
                .collect(groupingBy(Employee::getDept));

filter的方法参数为一个条件,filter筛选年龄大于25岁的员工

List<Employee> employeeFilter = stuList.stream()
                .filter(i -> i.getAge() > 25)
                .collect(toList());

distinct去除重复元素(不能根据对象属性内容去重)

List<Employee> employeeDistinct = stuList.stream()
                .distinct()
                .collect(toList());

limit返回指定流个数,limit的参数值必须>=0

List<Employee> employeeLimit = stuList.stream()
                .limit(3)
                .collect(toList());

skip跳过流中的元素,skip的参数值必须>=0,从第三个元素开始取值

List<Employee> employeeSkip = stuList.stream()
                .skip(2)
                .collect(toList());

map方法类似一个迭代器,获取集合中的部门

List<String> dept = stuList.stream()
                .map(i->i.getDept())
                .collect(Collectors.toList());

flatMap流转换, 获取员工列表中部门,有多个部门的按逗号分割并去重

List<String> deptDistinct = stuList.stream()
                .map(w -> w.getDept().split(","))
                .flatMap(Arrays::stream)
                .distinct()
                .collect(Collectors.toList());

获取员工年龄中最小值

Optional<Integer> min = stuList.stream()
                .map(Employee::getAge)
                .min(Integer::compareTo);

获取员工年龄中最小值

OptionalInt min2 = stuList.stream()
                .mapToInt(Employee::getAge)
                .min();

获取员工年龄中最大值

Optional<Integer> max = stuList.stream()
                .map(Employee::getAge)
                .max(Integer::compareTo);

获取员工年龄中最大值

OptionalInt max2 = stuList.stream()
                .mapToInt(Employee::getAge)
                .max();

minBy获取员工年龄最小值

Optional<Integer> minBy = stuList.stream()
                .map(Employee::getAge)
                .collect(minBy(Integer::compareTo));

maxBy获取员工年龄最大值

Optional<Integer> maxBy = stuList.stream()
             	.map(Employee::getAge)
             	.collect(maxBy(Integer::compareTo));

reduce获取获取员工年龄最大值

Optional<Integer> reduceMin = stuList.stream()
                .map(Employee::getAge)
                .reduce(Integer::min);

reduce获取获取员工年龄最大值

Optional<Integer> reduceMax = stuList.stream()
                .map(Employee::getAge)
                .reduce(Integer::max);

求和, 员工的薪资之和

double sum = stuList.stream()
        .collect(summingDouble(Employee::getSalary));
double sum2 = stuList.stream()
        .map(Employee::getSalary)
        .reduce(0.00, Double::sum);
double sum3 = stuList.stream()
        .mapToDouble(Employee::getSalary)
        .sum();

averagingInt求员工年龄平均值

double average = stuList.stream()
                .collect(averagingInt(Employee::getAge));

summarizingInt同时求员工薪资总和、平均值、最大值、最小值

DoubleSummaryStatistics doubleSummaryStatistics = stuList.stream()
                .collect(summarizingDouble(Employee::getSalary));
//获取平均值
double summarizingDoubleAverage = doubleSummaryStatistics.getAverage();  
//获取最小值
double summarizingDoubleMin = doubleSummaryStatistics.getMin();  
//获取最大值
double summarizingDoubleMax = doubleSummaryStatistics.getMax();  
//获取总和
double summarizingDoubleSum = doubleSummaryStatistics.getSum();  

返回员工姓名List集合

List<String> nameList = stuList.stream()
                .map(Employee::getName)
                .collect(toList());

返回员工姓名Set集合

Set<String> nameSet = stuList.stream()
                .map(Employee::getName)
                .collect(toSet());

通过joining用逗号拼接员工姓名

String joinName = stuList.stream()
                .map(Employee::getName)
                .collect(joining(", "));

通过groupingBy进行员工部门分组

Map<String, List<Employee>> deptGroup = stuList.stream()
                .collect(groupingBy(Employee::getDept));

allMatch匹配所有,员工年龄都大于60

boolean allMatch = stuList.stream()
                .allMatch(i -> i.getAge() > 60);

anyMatch匹配其中一个,存在员工年龄大于60的员工

boolean anyMatch = stuList.stream()
                .anyMatch(i -> i.getAge() > 60);

noneMatch全部不匹配,员工年龄都小于60

boolean noneMatch = stuList.stream()
                .noneMatch(i -> i.getAge() > 60);

通过count统计员工个数

Long count = stuList.stream()
                .count();

通过counting统计员工个数

Long counting = stuList.stream()
                .collect(counting());

findFirst查找年龄大于60岁的第一个员工

Optional<Employee> findFirst = stuList.stream()
                .filter(i -> i.getAge() > 60)
                .findFirst();

findAny随机查找一个年龄大于60岁的第一个员工

Optional<Employee> resultFindAny = stuList.stream()
                .filter(i -> i.getAge() > 60)
                .findAny();

partitioningBy进行分区, 对年龄大于60的与小于等于60的分区

Map<Boolean, List<Employee>> partitioningBy = stuList.stream()
                .collect(partitioningBy(i -> i.getAge() > 60));

对一个集合中的值进行求和

List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
//对一个集合中的值进行求和
int integerListSum = integerList.stream()
        .reduce(0, (a, b) -> (a + b));

//对一个集合中的值进行求和
int integerListSum2 = integerList.stream()
        .reduce(0, Integer::sum);

foreach进行元素遍历

stuList.stream().forEach(System.out::println);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值