java Stream API 配合Lambda表达式--JDK1.8新特性

思维导图

学习感悟

JDK1.8以后对集合操作提供了一些新的API,使用起来比较便利,除了代码可读性差一点(即lambda表达式),个人感觉值得学习。 例如下面分组需求:一个集合中存放多个学生对象,我需要根据学生性别分组,学生类如下:

package org.ymh.demo;

public class Student {
    private String name;
    private String sex;
    private String address;

    public Student(String name, String sex, String address) {
        this.name = name;
        this.sex = sex;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

传统方式:

public class Demo {
    public static void main(String[] args) {
        List<Student> students = Arrays.asList(
                new Student("张三", "男", "西安"),
                new Student("李四", "男", "西安"),
                new Student("王五儿", "女", "北京"),
                new Student("赵六儿", "女", "上海"),
                new Student("苏七", "男", "杭州")
        );
        HashMap<String, List<Student>> map = new HashMap<>();
        for (Student student : students) {
            if (student.getSex() == "男") {
                List<Student> list = map.get("男");
                if (list == null) {
                    list = new ArrayList<>();
                    map.put("男", list);
                }
                list.add(student);
            } else {
                List<Student> list2 = map.get("女");
                if (list2 == null) {
                    list2 = new ArrayList<>();
                    map.put("女", list2);
                }
                list2.add(student);
            }
        }
        System.out.println(map);
    }

接下来我们用Stream API中提供的方法改写

Collectors中的groupingby()方法可以实现按需求分组

public class Demo {
    public static void main(String[] args) {
        List<Student> students = Arrays.asList(
                new Student("张三", "男", "西安"),
                new Student("李四", "男", "西安"),
                new Student("王五儿", "女", "北京"),
                new Student("赵六儿", "女", "上海"),
                new Student("苏七", "男", "杭州")
        );

        Map<String, List<Student>> map = students.stream().collect(Collectors.groupingBy((s) -> s.getSex() ));
        System.out.println(map);
    }
}

利用lambda表达式配合流方法,简单的一行代码就实现了这个需求。

IntStream对整数进行操作

public class Demo {
    public static void main(String[] args) {
        //求最大值
        System.out.println(IntStream.of(45,32,65,95,7,85).max());
        //求最小值
        System.out.println(IntStream.of(45,32,65,95,7,85).min());
        //求平均值
        System.out.println(IntStream.of(45,32,65,95,7,85).average());
        //求和
        System.out.println(IntStream.of(45,32,65,95,7,85).sum());
    }
}

利用这个方法我们就不需要将整数先存入集合,遍历集合,比较大小,累加,求平均值等操作了。

Stream API 的流水线思想(懒加载)

Pipeline 流水线思想:流中的数据时流动的,而且是一个一个处理的,一个不处理完成,下一个绝对不会被处理。即每个数据会经过后续的filter, map等方法依次调用。没有遇到终结方法,以上方法也不会执行。

常见的终结方法:collect()、sum()、max()、min()等

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值