java基础 :Stream流

2021-01-29  本文已影响0人  圆企鹅i

使用场景 复杂数据的处理 stream流天下无敌

Stream流可以让数据处理更加简单
写起来更加方便 阅读性也更强
ps:并行流在处理超大的数据量是速度快很多

1.1流的获取

常用开流
ArrayList<Object> list = CollUtil.newArrayList(1,2,3);//hutool
//最常用开流
list.stream();
//100w+的复杂数据操作 并行流可以调用全部cpu 但是数据量少非常不适合
list.parallelStream()
//不常用开流
Stream.of(list).forEach();
Map开流有一点不一样
//双列:Map不能直接获取流对象
keySet().stream();    所有键的流
values().stream();    所有值的流
entrySet().stream();  所有键值对的流

1.2Stream类静态方法

迭代流iterate
//从0开始 逐个+2 的十个数字
Stream.iterate(0,x->x+2).limit(10).forEach(System.out::print);
无序流generate
//5个随机数 
Stream.generate(Math::random).limit(5).forEach(System.out::print);

2.1截取和切片

filter(常用)

过滤得到符合条件的数据

//过滤掉为空的数据
sortBuilders.stream().filter(Objects::nonNull).forEach(requestBuilder::addSort);
limit&skip
//截取只要前五个数据
sortBuilders.stream().limit(5).forEach(requestBuilder::addSort);
//不要前十个数据
sortBuilders.stream().skip(10).forEach(requestBuilder::addSort);
distinct去重(常用)
sortBuilders.stream().distinct().forEach(requestBuilder::addSort);

3.1遍历数据

map遍历每一个数据(常用)

ps:遍历之后返回执行结果

nodeInfos.stream().map(NodeInfo::getId).forEach(System.out::print);
peek遍历每一个数据(常用)

ps:遍历之后不执行结果
注意坑! 如果这个方法结尾不是count/collect会不生效
JDK10之后 peek+count也会失效
peek原本设计之初就是用来debug数据的 虽然也挺好用
某些情况可以用foreach代替

ArrayList<Object> list = CollUtil.newArrayList();
nodeInfos.stream().peek(list::add).forEach(System.out::print);
flatMap 把集合打散 遍历每一个数据(常用)

List<List<Bean>>怎么办 flatMap可以把集合直接打散成 Bean,Bean,Bean,Bean...

relationConfigEntities.stream()
                .map(GraphRelationConfigEntity::getRelations)
                //解析成JSONArray
                .map(JSON::parseArray)
                //将解析的多个数组 全部打散成一个个的数据
                .flatMap(Collection::stream)
                .map(Object::toString)
                //set去重
                .collect(Collectors.toSet());
foreach 遍历

比较特殊 后面说

4.1流的结束

流都是要结束的

foreach 遍历

可以看到前面的例子都是有结尾的

搜索方法(不常用)
#里面是不是全叫pdd
 boolean isPdd = nodeInfos.stream().map(NodeInfo::getLabel).allMatch("pdd"::equals);

同理还有

anyMatch#有任何一个
noneMatch#没用一个匹配
findFirst/findAny#返回第一个元素/返回任意/
count#数量
max/min//最大最小
nodeInfos.stream().peek(list::add).forEach(System.out::print);

X.x特殊

去重

针对list中map的某个属性去重(针对bean来去重更简单)

  //map自定义去重方法
   List<Map<String,String>> distinctResp = resp.stream()
                .filter(distinctByKey(temMap -> {
                    //如果是key1 = value 则根据type进行去重
                    if ("value1".equals(temMap.get("key1"))) {
                        return temMap.get("type");
                    }
                    //否则对整个对象去重
                    return temMap;
                }))
                .collect(Collectors.toList());
   /**
     * 自定义去重方法
     *
     * @param keyExtractor
     * @param <T>
     * @return
     */
    public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

数据解析 打撒去重

 Set<String> relations = relationConfigEntities.stream()
                .map(GraphRelationConfigEntity::getRelations)
                //解析成JSONArray
                .map(JSON::parseArray)
                //将解析的多个数组 全部打散成一个个的数据
                .flatMap(Collection::stream)
                .map(Object::toString)
                //set去重
                .collect(Collectors.toSet());
上一篇 下一篇

猜你喜欢

热点阅读