javaStream流学习

Stream

Java8 API添加了一个新的抽象称为流 Stream ,可以让

你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直

观方式来提供一种 Java 集合运算和表达的高阶抽

。Stream API可以极大提高Java程序员的生产力,让

程序员写出高效率、干净、简洁的代码。这种风格将要

处理的元素集合看作一种流, 流在管道中传输, 并且可

以在管道的节点上进行处理, 比如筛选, 排序,聚合

等。

元素流在管道中经过中间操作(intermediate

operation)的处理,最后由最终操作(terminal

operation)得到前面处理的结果。

Stream(流)是一个来自数据源的元素队列并支持聚合

操作

元素是特定类型的对象,形成一个队列。 Java中的

Stream并不会存储元素,而是按需计算

数据源 流的来源。 可以是集合,数组等。

聚合操作 类似SQL语句一样的操作, 比如filter, map,

reduce, find, match, sorted等。Java 8 中的 Stream 是对集合(Collection)对象功能的

增强,它专注于对集合对象进行各种非常便利、高效的

聚合操作(aggregate operation),或者大批量数据操作

(bulk data operation)。

获取流

  1. 可以通过Conllection系列集合提供的顺序

    流stream()或并行流parallelStream()

    public class TestStreamAPI1 { 
    // 创建
    Stream public void test1() { 
    // 1、可以通过Conllection系列集合提供的顺序 流stream()或并行流parallelStream() 
    List<String> list = new ArrayList<>(); Stream<String> stream1 = list.stream(); 
    stream1 = list.parallelStream(); 
    // 2、通过Arrays中的静态方法stream()获取数 据流 Integer ints[] = new Integer[10]; Stream<Integer> stream2 = Arrays.stream(ints); // 3、通过Stream类中的静态方法of() 
    Stream<String> stream3 = Stream.of("aa", "bb", "cc"); 
    String str[] = new String[10]; Stream<String> stream4 = Stream.of(str) } }
    
  2. 通过Arrays中的静态方法stream()获取数

    据流

    package com.lwf.homeWork;
    
    import java.util.Arrays;
    
    /**
     * @author lwf
     * @title: StreamWork
     * @projectName 10_24Code
     * @description: TODO
     * @date 2020/10/2515:35
     */
    public class StreamWork {
        public static void main(String[] args) {
            printAbs(new int[]{2,-5,6,-2,0,-6});
            printPow(new int[]{2,-5,6,-2,0,-6});
        }
        //打印绝对值
        public static void printAbs(int[] num){
            Arrays.stream(num).map(n->Math.abs(n)).forEach(System.out::println);
        }
        //打印平方
        public static void printPow(int[] num){
            Arrays.stream(num).map(n->n*n).forEach(System.out::println);
        }
    }
    
    
  3. 通过Stream类中的静态方法of()

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4gz8ZCEt-1603616308346)(https://raw.githubusercontent.com/lwfqw/shsxt/master/10_24Code/img/image-20201025162946815.png)]

过滤流

fiter过滤

传入一个转化为流的容器存放对象,返回一个布尔值判断是否加入流

package com.lwf.stream;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

/**
 * @author lwf
 * @title: Demo1
 * @projectName 10_24Code
 * @description: 流过滤懒执行:获取结果时才执行
 * @date 2020/10/2411:10
 */
public class Demo1 {
    public static void main(String[] args) {
        List<Panda> list=new ArrayList<>();
        list.add(new Panda(1,"jxa","cd"));
        list.add(new Panda(2,"jxs","cd"));
        list.add(new Panda(3,"jxd","sh"));
        list.add(new Panda(4,"jxf","cd"));
        list.stream().filter(r->r.getLocate().equals("cd")).limit(3).skip(0).forEach(c-> System.out.println(c));
        System.out.println(list.parallelStream().findAny().get());
    }
}

limit(n)

指定流前n条数据

skip(n)

跳过前n条数据

distinct()

去重复

map()

传入一个方法接口,接口处理接收对象提取对象特定信息加入新的流

foreach(System.out::println)

遍历打印流

count()流长度

package com.lwf.homeWork;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lwf
 * @title: Goods
 * @projectName 10_24Code
 * @description: TODO
 * @date 2020/10/2515:48
 */
public class Goods {
    public static void main(String[] args) {
        List<Goods> list=new ArrayList<>();
        list.add(new Choes(12, "adidas", Type.choes));
        list.add(new Phone(43, "huawei", Type.phone));
        list.add(new Phone(66, "chenguang", Type.pen));
        list.add(new Choes(19, "nike", Type.choes));
        list.add(new Choes(18, "nike", Type.choes));
        list.add(new Phone(49, "xiaomi", Type.phone));
        list.add(new Choes(34, "huili", Type.choes));
        list.add(new Phone(36, "meizu", Type.phone));
        list.add(new Choes(7, "hailan", Type.choes));
        //鞋子销量排行
        list.stream().filter(g->g.getType()==Type.choes).sorted((o,a)->{
            return Integer.compare(o.getSell(), a.getSell());
        }).forEach(System.out::println);
        //手机产品
        list.stream().filter(g->g.getType()==Type.phone).forEach(System.out::println);
        //几种鞋子
        System.out.println(list.stream().filter(g -> g.getType() == Type.choes).map(g -> g.getName()).distinct().count());
    }
    private int sell;
    private String name;
    private Type type;

    public Goods(int sell, String name, Type type) {
        this.sell = sell;
        this.name = name;
        this.type = type;
    }

    public int getSell() {
        return sell;
    }

    public void setSell(int sell) {
        this.sell = sell;
    }

    public String getName() {
        return name;
    }

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

    public Type getType() {
        return type;
    }

    public void setType(Type type) {
        this.type = type;
    }

    @Override
    public boolean equals(Object obj) {
        Goods goods = (Goods)obj;
        return this.getName().equals(goods.getName());
    }

    @Override
    public String toString() {
        return "Goods{" +
                "sell=" + sell +
                ", name='" + name + '\'' +
                ", type=" + type +
                '}';
    }
}
enum Type{
    phone,choes,pen;
}
class Phone extends Goods{
    public Phone(int sell, String name, Type type) {
        super(sell, name, type);
    }
}
class Choes extends Goods{
    public Choes(int sell, String name, Type type) {
        super(sell, name, type);
    }
}
class Pen extends Goods{
    public Pen(int sell, String name, Type type) {
        super(sell, name, type);
    }
}

流是懒加载,所以对流无论进行多少次操作都会取结果时一起打印·(foreach和count)

全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务