美文网首页java学习之路
JAVA8常用的一些流计算方法

JAVA8常用的一些流计算方法

作者: 唯有努力不欺人丶 | 来源:发表于2021-09-14 15:48 被阅读0次

无数次为流计算惊奇和赞叹。其实我也是近几个月才开始大量使用流计算的,很早以前就接触到了但是一直没重视。新公司大部分代码用到了流计算,为了入乡随俗所以学着使用,现在只想说真香。下面简单的记录几个常用的计算方法。

List转Map

list转map是比较常见的功能。其中又可以细分两种,一种是1v1转,一种是1vN转,也就是传说中的分组。

1v1-list转map:
    public static void main(String[] args) {
        List<UserVO> list = new ArrayList<>();
        //list中对象userId唯一,orgId  分三种0,1.2
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            list.add(userVO);
        }
        //以整个对象为value
        Map<Integer,UserVO> map = list.stream().collect(Collectors.toMap(UserVO::getUserId,u->u));
        //以对象某个属性为value
        Map<Integer,String> nameMap = list.stream().collect(Collectors.toMap(UserVO::getUserId,UserVO::getFullName));
    }
1vN-list转map:
    public static void main(String[] args) {
        List<UserVO> list = new ArrayList<>();
        //list中对象userId唯一,orgId  分三种0,1.2
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            list.add(userVO);
        }
        //以整个对象为value
        Map<Integer,List<UserVO>> map = list.stream().collect(Collectors.groupingBy(UserVO::getOrgId,Collectors.toList()));
    }

Set转Map

一定程度上set和list是一样的,所以这里也可以和上面一样处理。

1vN-set转map:
    public static void main(String[] args) {
        Set<UserVO> set = new HashSet<>();
        //list中对象userId唯一,orgId  分三种0,1.2
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            set.add(userVO);
        }
        //以整个对象为value
        Map<Integer,List<UserVO>> map = set.stream().collect(Collectors.groupingBy(UserVO::getOrgId,Collectors.toList()));
    }
1v1-set转map:
    public static void main(String[] args) {
        Set<UserVO> set = new HashSet<>();
        //list中对象userId唯一,orgId  分三种0,1.2
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            set.add(userVO);
        }
        //以整个对象为value
        Map<Integer,UserVO> entityMap = set.stream().collect(Collectors.toMap(UserVO::getUserId,u->u));
        //以某一属性为value
        Map<Integer,String> map = set.stream().collect(Collectors.toMap(UserVO::getUserId,UserVO::getFullName));
    }

Set与List互相转化

    public static void main(String[] args) {
        Set<UserVO> set = new HashSet<>();
        //list中对象userId唯一,orgId  分三种0,1.2
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            set.add(userVO);
        }
        List<UserVO> list = set.stream().collect(Collectors.toList());
        Set<UserVO> setNew = list.stream().collect(Collectors.toSet());
    }

字符串转化成List

注意这里我用的例子是转化成Integer。所以多了Integer::valueOf这个步骤。

    public static void main(String[] args) {
        String str = "2312,1,524,67,23,58,32";
        ArrayList<Integer> list = Arrays.stream(str.split(","))
            .map(String::trim).map(Integer::valueOf)
            .collect(Collectors.toCollection(ArrayList::new));
        System.out.println(list);
    }

List/Set中某一列求和

    public static void main(String[] args) {
        Set<UserVO> set = new HashSet<>();
        //list中对象userId唯一,orgId  分三种0,1.2
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            set.add(userVO);
        }
        Integer sum = set.stream().mapToInt(UserVO::getOrgId).sum();
        List<UserVO> list = set.stream().collect(Collectors.toList());
        Integer sum1 = list.stream().mapToInt(UserVO::getOrgId).sum();
    }

根据条件过滤转化

    public static void main(String[] args) {
        Set<UserVO> set = new HashSet<>();
        //list中对象userId唯一,orgId  分三种0,1.2
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            set.add(userVO);
        }
        List<UserVO> list = set.stream().filter(u->u.getUserId()<10).collect(Collectors.toList());
        System.out.println(list.size());
    }

List/Set对象的某一属性组成新的list/set

    public static void main(String[] args) {
        Set<UserVO> set = new HashSet<>();
        //list中对象userId唯一,orgId  分三种0,1.2
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            set.add(userVO);
        }
        List<String> list = set.stream().map(UserVO::getFullName).collect(Collectors.toList());
    }

感觉常用的语法好像就这么多了,其实说实话流计算本身解决不了技术上的问题,但是大大方便的使用者的调用。以上功能自己去遍历循环等最终也可以实现的,不过现在一行代码解决还是方便的很。其实它应该还有很多语法,感兴趣的可以自己去看API。
本篇笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注,也祝大家工作顺顺利利,生活健健康康!

相关文章

网友评论

    本文标题:JAVA8常用的一些流计算方法

    本文链接:https://www.haomeiwen.com/subject/mmccgltx.html