Java Stream流常用API

目录

一、Stream流介绍

二、常见API合集

1.数据准备

2.collect()——动态创建List并添加元素

3.map()——对某个元素进行指定操作,并将处理后的元素存入新的List

4.filter()——根据指定条件过滤掉流中的元素

5.forEach()——对每个元素执行指定操作

6.flatMap()——将流中每一元素转换为一个新的流并连接形成一个新的流

7. reduce()——流的累积操作

8.distinct()——去掉重复元素

9.sorted()——排序操作

10.limit()——截断流,指定所需保留元素个数

11.skip()——跳过指定数量的元素

12.anyMatch()、allMatch()、noneMatch()——判断流中是否有满足指定条件的元素

13.findAny()、findFrist()——查找流中第一个或任意一个元素

14.min()、max()——可查找流中最大或最小值

15.groupBy()——按照指定条件进行分组

16.利用stream流的特质,可对某一属性进行求和

17.利用流将List转化为Map

18.同理我们也可以使用流将Map转化为List

19.利用流实现分页功能

三、总结


一、Stream流介绍

        Stream是Java8 API添加的一个新的抽象,称之为流Stream,以一种声明性方式处理数据集合,其侧重于对于源数据计算能力的封装,同时支持序列与并行两种操作方式。(Stream流是对集合对象功能的增强,与Lambda表达式结合,可以提高编程效率以及代码的可读性)

        对于Stream流我们可以理解为工厂流水线一样,每一个流都是按照创建——>操作处理——>得到结果。其接口继承关系如下图所示

二、常见API合集

1.数据准备

        后续大部分案例我们都以User作为例子

package day0716;

public class User {

    private String name;
    private int age;
    private String sex;
    private double height;

    public User(){
    }

    public User(String name, int age, String sex, double height) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.height = height;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

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

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", bodyHeight=" + height +
                '}';
    }
}

2.collect()——动态创建List并添加元素

    /**
     * 利用Stream流动态创建list并添加元素
     * @author wdl
     * @param users
     */
    public static List<User> createList(User... users){
        List<User> usersList = Stream.of(users).collect(Collectors.toList());
        return usersList;
    }

3.map()——对某个元素进行指定操作,并将处理后的元素存入新的List

    /**
     * 获取list中对象某一属性,并生成新的list。此处以获取User对象的name为例
     * @author wdl
     * @param userList
     */
    public static List<String> collectName(List<User> userList){
        List<String> nameList = userList.stream().map(User::getName).collect(Collectors.toList());
        return nameList;
    }

4.filter()——根据指定条件过滤掉流中的元素

    /**
     * 利用stream的filter方法,过滤掉我们不需要的数据,此处以过滤User对象中name为空的例子
     * @author wdl
     * @param userList
     */
    public static List<User> filterNull(List<User> userList){
        List<User> filterList = userList.stream().filter(user -> user.getName()!=null).collect(Collectors.toList());
        return filterList;
    }

5.forEach()——对每个元素执行指定操作

    /**
     * 对流中的每个元素进行操作,此处以修改每个user的age == 18为例
     * @author wdl
     * @param userList
     * @return
     */
    public static List<User> forEachSetAge(List<User> userList){
        userList.stream().forEach(user -> user.setAge(18));
        return userList;
    }

6.flatMap()——将流中每一元素转换为一个新的流并连接形成一个新的流

可理解为一个List中的所有元素都是List,使用方法后将元素List拆开,形成一个新的List。

    /**
     * 将流中每个元素转换为流,将这些流整合为一个新的流。
     * 此处我们以List作为元素装入一个List为例,最后生成一个新的List
     * @author wdl
     * @param nameList
     * @return
     */
    public static List<String> flatMapList(List<List<String>> nameList){
        List<String> newStringList = nameList.stream()
                .flatMap(List::stream)
                .collect(Collectors.toList());
        return newStringList;
    }

7. reduce()——流的累积操作

    /**
     * 对流中的元素进行累积操作,如最大、最小、求和
     * @author wdl
     * @param ageList
     * @return sumAge
     */
    public static Integer reduceAge(List<Integer> ageList){
        // 求和
        Integer sumAge = ageList.stream().reduce(0, Integer::sum);
        // 最大值
        // Integer maxAge = ageList.stream().reduce(0, Integer::max);
        // 最小值
        // Integer minAge = ageList.stream().reduce(0, Integer::min);

        return sumAge;
    }

8.distinct()——去掉重复元素

    /**
     * 对流中的元素进行去重操作
     * @author wdl
     * @param repeatList
     * @return integerList
     */
    public static List<Integer> distinctAge(List<Integer> repeatList){
        List<Integer> integerList = repeatList.stream()
                .distinct()
                .collect(Collectors.toList());
        return integerList;
    }

9.sorted()——排序操作

    /**
     * 对流中的元素进行排序操作
     * @author wdl
     * @param disorderedList
     * @return ordinalList
     */
    public static List<Integer> sortedList(List<Integer> disorderedList){
        List<Integer> ordinalList = disorderedList.stream()
                .sorted()
                .collect(Collectors.toList());
        return ordinalList;
    }

10.limit()——截断流,指定所需保留元素个数

    /**
     * 对流中的元素进行截断操作
     * @author wdl
     * @param targetList
     * @return newlimitList
     */
    public static List<Integer> limitList(List<Integer> targetList,int targetNumber ){
        List<Integer> newlimitList = targetList.stream()
                .limit(targetNumber)
                .collect(Collectors.toList());
        return newlimitList;
    }

11.skip()——跳过指定数量的元素

    /**
     * 跳过target个数的元素
     * @author wdl
     * @param targetList
     * @return newlimitList
     */
    public static List<Integer> skipList(List<Integer> targetList,int target ){
        List<Integer> newSkipList = targetList.stream()
                .skip(target)
                .collect(Collectors.toList());
        return newSkipList;
    }

12.anyMatch()、allMatch()、noneMatch()——判断流中是否有满足指定条件的元素

    /**
     * 判断流中是否有任意一个元素与target目标元素匹配
     * 此处因为使用的Integer类型的List 以及 int类型的target
     * 可根据需求修改传入参数类型
     * @author wdl
     * @param targetList  target
     * @return anyMatchBoolean
     */
    public static boolean anyMatchList(List<Integer> targetList,int target ){
        boolean anyMatchBoolean = targetList.stream()
                // 这里的匹配条件根据需求自行修改
                .anyMatch(i -> i == target);
        return anyMatchBoolean;
    }

    /**
     * 判断流中是否所有元素与target目标元素匹配
     * 此处因为使用的Integer类型的List 以及 int类型的target
     * 可根据需求修改传入参数类型
     * @author wdl
     * @param targetList  target
     * @return allMatchBoolean
     */
    public static boolean allMatchList(List<Integer> targetList,int target ){
        boolean allMatchBoolean = targetList.stream()
                // 这里的匹配条件根据需求自行修改
                .allMatch(i -> i == target);
        return allMatchBoolean;
    }

    /**
     * 判断流中是否没有任何一个元素与target目标元素匹配
     * 此处因为使用的Integer类型的List 以及 int类型的target
     * 可根据需求修改传入参数类型
     * @author wdl
     * @param targetList  target
     * @return noneMatchBoolean
     */
    public static boolean noneMatchList(List<Integer> targetList,int target ){
        boolean noneMatchBoolean = targetList.stream()
                // 这里的匹配条件根据需求自行修改
                .noneMatch(i -> i == target);
        return noneMatchBoolean;
    }

13.findAny()、findFrist()——查找流中第一个或任意一个元素

    /**
     * 查找流中第一个元素
     * @author wdl
     * @param targetList
     * @return integer
     */
    public static Integer findFristList(List<Integer> targetList){
        Integer integer = targetList.stream().findFirst().orElse(1);
        return integer;
    }

    /**
     * 查找流中任意一个元素
     * @author wdl
     * @param targetList
     * @return integer
     */
    public static Integer findAnyList(List<Integer> targetList ){
        Integer integer = targetList.stream().findAny().orElse(1);
        return integer;
    }

14.min()、max()——可查找流中最大或最小值

    /**
     * 查找流中最大元素
     * @author wdl
     * @param targetList
     * @return max
     */
    public static Integer findMaxList(List<Integer> targetList){
        Integer max = targetList.stream().max(Integer::compareTo).orElse(null);
        return max;
    }

    /**
     * 查找流中最小元素
     * @author wdl
     * @param targetList
     * @return min
     */
    public static Integer findMinList(List<Integer> targetList ){
        Integer min = targetList.stream().min(Integer::compareTo).orElse(null);
        return min;
    }

15.groupBy()——按照指定条件进行分组

    /**
     * 利用Collectors.groupingBy,根据我们所需要的某些属性进行分组
     * 此处以根据User对象的sex字段进行分组。
     * @author wdl
     * @param userList
     * @return
     */
    public static Map<String,List<User>> groupBySex(List<User> userList){
        Map<String, List<User>> sexMap = userList.stream()
                .collect(Collectors.groupingBy(User::getSex, Collectors.toList()));
        return sexMap;
    }

16.利用stream流的特质,可对某一属性进行求和

    /**
     * 利用stream流求和,返回对象中某一属性的总和
     * 数据类型只能为:int, double, long
     * @author wdl
     * @param userList
     * @return
     */
    public static Double sumHeight(List<User> userList){
        Double heightSum = userList.stream().mapToDouble(User::getHeight).sum();
        return heightSum;
    }

17.利用流将List转化为Map

    /**
     * 利用stream流将list转化为map使用
     * (1)转换map,key重复问题;代码中使用(key1,key2)->key2表达式可以解决此类问题,
     * 如果出现重复的key就使用key2覆盖前面的key1,也可以定义成(key1,key2)->key1,保留key1,根据自己的业务场景来调整。
     * (2)空指针异常,即转为map的value是null。这个可以用filter过滤;
     * @auhtor wdl
     * @param users
     * @return stringUserMap
     */
    public Map<String, User> listToMap(List<User> users){
        Map<String, User> stringUserMap = users.stream()
                .collect(Collectors.toMap(User::getName, Function.identity(), (key1, key2) -> key1));
        return stringUserMap;
    }

18.同理我们也可以使用流将Map转化为List

    /**
     * 利用stream流将map转化为list
     * @author wdl
     * @param userMap
     * @return userMapList
     */
    public List<User> mapToList(Map<String, User> userMap){
        List<User> userMapList = userMap.entrySet().stream()
                .map(item -> item.getValue())
                .collect(Collectors.toList());
        return userMapList;
    }

19.利用流实现分页功能

    /**
     * 分页功能
     * @author
     * @param map
     * @param pageNum
     * @param pageSize
     * @return pagedMap
     */
    public Map<String,Object> pagingMap(Map<String,Object> map,Integer pageNum,Integer pageSize){
        // 将Map转换为Stream
        Stream<Map.Entry<String, Object>> mapStream = map.entrySet().stream();
        // 计算分页起始位置
        int start = (pageNum - 1) * pageSize;
        // 计算分页结束位置
        int end = start + pageSize;
        // 跳过前start个元素
        Map<String, Object> pagedMap = mapStream.skip(start)
                // 最多返回pageSize个元素
                .limit(pageSize)
                // 将结果转换回Map
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        return pagedMap;

    }

三、总结

        以上就是本文整理出来的一些常用方法以及方法的综合运用,大家若有一些好的案例也希望大家分享在评论区,最后祝愿大家早日升P7!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值