美文网首页
java基础 :Stream流

java基础 :Stream流

作者: 圆企鹅i | 来源:发表于2021-01-29 20:05 被阅读0次

使用场景 复杂数据的处理 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());

相关文章

  • Java8之Stream流(六)收集

    Java8之Stream流(一)基础体验 Java8之Stream流(二)关键知识点 Java8之Stream...

  • Java基础系列-Stream

    原创文章,转载请标注出处:《Java基础系列-Stream》 一、概述 Stream操作简称流操作,这里的流与IO...

  • JDK8新特性之Stream流

    是什么是Stream流 java.util.stream.Stream Stream流和传统的IO流,它们都叫流,...

  • java基础 :Stream流

    使用场景 复杂数据的处理 stream流天下无敌 Stream流可以让数据处理更加简单写起来更加方便 阅读性也更强...

  • 八 JDK8新特性——第三节 两种获取Stream流的方式

    1、两种获取Stream流的方式 java.util.stream.Stream 是java 8 加入的最常...

  • Java流操作总结

    Java流(Stream)操作自Java 8引入,通过Stream操作可以简化代码编写,提高代码执行效率。流整体操...

  • Java中Stream操作

    Java中Stream操作 流 此处的流(Stream)与io中的输入流(InputStream)与输出流(Out...

  • Stream

    使用 Stream API 高逼格 优化 Java 代码 Java8 Stream流中的 collect() 别再...

  • Stream流

    Stream流 java8新特性 Stream定义 A sequence of elements supporti...

  • Java 8 Stream Study

    Java 8 Stream Study Java 8 Stream Java 8 API添加了一个新的抽象称为流S...

网友评论

      本文标题:java基础 :Stream流

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