Stream流入门

一、简介

流操作是Java8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的 API和新增Stream操作。Stream类中每一个方法都对应集合上的一种操作。将真正的函数式编程引入到Java中,能 让代码更加简洁,极大地简化了集合的处理操作,提高了开发的效率和生产力。

同时stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。在Stream中的操作每一次都会产生新的流,内部不会像普通集合操作一样立刻获取值,而是惰性 取值,只有等到用户真正需要结果的时候才会执行。并且对于现在调用的方法,本身都是一种高层次构件,与线程模型无关。因此在并行使用中,开发者们无需再去操心线程和锁了。Stream内部都已经做好了。

如果刚接触流操作的话,可能会感觉不太舒服。其实理解流操作的话可以对比数据库操作。把流的操作理解为对数据库中 数据的查询操作 
    集合 = 数据表
    元素 = 表中的每条数据 
    属性 = 每条数据的列
    流API = sql查询 

废话不说,直接上代码

先来 实体类User

@Data
public class User {

    private String uuid;

    private Integer age;

    private String name;

    private String pwd;

    private String sign;
}

搞点假数据

       List users = new ArrayList<>();
        users.add(new User("1",1,"张三","zzz","愿你所有的日子都比不上明天的光辉"));
        users.add(new User("2",2,"李四","xxx","花有重开日,人无再少年"));
        users.add(new User("3",3,"王五","zzz","我想真正的成熟应该并不是追求完美,而是直面自己的缺憾,这才是生活的本质"));
        users.add(new User("4",4,"赵六","zc","生活不可能像你想的那么好,但也不会像你想的那么糟。我觉得人的脆弱和坚强都是超乎自己想象的。有时,人可能脆弱得一句话就泪流满面。有时,也发现自己咬着牙走了很长的路"));
        users.add(new User("1",5,null,"zzz","人生当中成功只是一时的,失败却是主旋律"));

        List userIds = getUserIds(users);
        System.out.println(userIds);
        List userIds8 = getUserIds8(users);
        System.out.println(userIds8);
        Set userIds2 = getUserIds2(users);
        System.out.println(userIds2);
        List userIds10 = getUserIds10(userIds);
        System.out.println(userIds10);
        String[] s= {"2","3","1","4","6"};
        List userIds11 = getUserIds11(s);
        System.out.println(userIds11);
        Map map = getMap(users);
        System.out.println(map);
        Map> mapGroup = getMapGroup(users);
        System.out.println(mapGroup);

正文来了,基本用法

 /**
     * jdk8 从集合对象中获取用户ID集合
     * @param userList
     * @return
     */
    public static List getUserIds(List userList){
        List userIds = userList.stream().map(User::getUuid).collect(Collectors.toList());
        userList.stream().collect(Collectors.groupingBy(a ->a.getName().equals("张三")));
        return userIds;
    }

    /**
     * jdk8 从集合对象中筛选出用户ID不为空的数据
     * @param userList
     * @return
     */
    public static List getUserIds8(List userList){
        List userIds = userList.stream().filter(item -> item.getName() != null).map(User::getUuid).collect(Collectors.toList());
        return userIds;
    }

    /**
     * jdk8 从集合对象中筛选出用户ID不为空的数据,并进行去重
     * @param userList
     * @return
     */
    public static Set getUserIds2(List userList){
        Set userIds = userList.stream().filter(item -> item.getName()!= null).map(User::getUuid).collect(Collectors.toSet());
        return userIds;
    }

    /**
     * jdk8 将Long类型数据转换成String类型
     * @param userIds
     * @return
     */
    public static List getUserIds10(List userIds){
        List userIdStrs = userIds.stream().map(x -> new Long(x)).collect(Collectors.toList());
        return userIdStrs;
    }

    public static List getUserIds11(String[] userIds) {
        //创建一个字符串数组
//        String[] strArray = new String[]{"a","b","c"};
        //转换后的List 属于 java.util.ArrayList 能进行正常的增删查操作
        List strList = Stream.of(userIds).collect(Collectors.toList());
        return  strList;
    }

    /**
     * jdk8 将集合转换成Map,其中用户ID作为主键key,如果集合对象有重复的key,以第一个匹配到的为主
     * @param userList
     * @return
     *
     * 第一个参数:表示 key
     * 第二个参数:表示 value
     * 第三个参数:表示某种规则
     * 上文中的Collectors.toMap(User::getUserId, v -> v, (k1,k2) -> k1),表达的意思就是将userId的内容作为key,v -> v是表示将元素user作为value,
     * 其中(k1,k2) -> k1表示如果存在相同的key,将第一个匹配的元素作为内容,第二个舍弃!
     *
     */
    public static Map getMap(List userList){
        Map userMap = userList.stream().collect(Collectors.toMap(User::getUuid, v -> v, (k1, k2) -> k1));
        return userMap;
    }


    /**
     * jdk8 将集合转换成Map,将相同的key,加入到一个集合中,实现分组
     * @param userList
     * @return
     */
    public static Map> getMapGroup(List userList){
        Map> userMap = userList.stream().collect(Collectors.groupingBy(User::getUuid));
        return userMap;
    }

上述操作仅仅为了简化collection操作,避免代码量过大

你可能感兴趣的:(Stream流入门)