Java8---stream()方法的使用

班级类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Objects;

/**
 * @Description TODO
 * @Author pdl
 * @Date 2020/7/30 11:28
 * @Version 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StuClass {
    private String className;
    private String schoolName;

    @Override
    public boolean equals(Object o) {
        if (this == o){
            return true;
        }
        if (o == null || getClass() != o.getClass()){
            return false;
        }
        StuClass stuClass = (StuClass) o;
        return Objects.equals(schoolName, stuClass.schoolName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(schoolName);
    }
}

学生类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Objects;

/**
 * @Description TODO
 * @Author pdl
 * @Date 2020/7/30 11:27
 * @Version 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private String name;
    private String className;
    private String school;

    @Override
    public boolean equals(Object o) {
        if (this == o){
            return true;
        }
        if (o == null || getClass() != o.getClass()){
            return false;
        }
        Student student = (Student) o;
        return Objects.equals(className, student.className) ;
    }

    @Override
    public int hashCode() {
        return Objects.hash(className);
    }
}

stream方法调用

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description TODO
 * @Author pdl
 * @Date 2020/7/30 11:27
 * @Version 1.0
 */
public class StreamLearn {
    public static void main(String[] args) {
        Student a = new Student("a", "1", "实验二小");
        Student b = new Student("b", "2", "实验二小");
        Student c = new Student("c", "2", "实验一小");
        Student d = new Student("d", "1", "实验二小");
        List<Student> students = Arrays.asList(a, b, c, d);
        StuClass A = new StuClass("1", "实验二小");
        StuClass B = new StuClass("1", "实验二小");
        StuClass C = new StuClass("2", "实验一小");
        List<StuClass> stuClasses = Arrays.asList(A, B, C);
        System.out.println("+++++++++++++++++++filter():过滤操作++++++++++++++++++++++++++");
        List<Student> list1 = students.stream().filter(student -> student.getSchool().equals("实验二小")).collect(Collectors.toList());
        list1.forEach(student -> System.out.println(student));
        System.out.println("++++++++++++++++++++distinct():去重 需要重写equal方法+++++++++++++++++++++++++");
        List<StuClass> list2 = stuClasses.stream().distinct().collect(Collectors.toList());
        list2.forEach(stuClass -> System.out.println(stuClass));
        System.out.println("++++++++++++++++++++limit():限制返回数量+++++++++++++++++++++++++");
        List<Student> list3 = students.stream().limit(1).collect(Collectors.toList());
        System.out.println("list3=" + list3.size());
        list3.forEach(student -> System.out.println(student));
        System.out.println("+++++++++++++++++++skip():返回一个扔掉了前n个元素的流。++++++++++++++++++++++++++");
        List<Student> list4 = students.stream().skip(1).collect(Collectors.toList());
        System.out.println("list4=" + list4.size());
        list4.forEach(student -> System.out.println(student));
        System.out.println("+++++++++++++++++++map():一种中间操作,抽取集合对象中的某些参数,创建一个新的对象集合。++++++++++++++++++++++++++");
        List<StuClass> list5 = students.stream().map(student -> {
            StuClass stuClass = new StuClass(student.getClassName(), student.getSchool());
            return stuClass;
        }).collect(Collectors.toList());
        list5.forEach(stuClass -> System.out.println(stuClass));
        System.out.println("+++++++++++++++++++flatMap():中间操作,与map类似,但是它可以对stream流中单个元素再进行拆分(切片),从另一种角度上说,使用了它,就是使用了双重for循环。++++++++++++++++++++++++++");
        //查询出为一班的学生,匹配出与该班级号相同的班级
        List<StuClass> list6 = students.stream().filter(student -> student.getClassName().equals("1")).distinct().
                flatMap(s -> stuClasses.stream().
                        filter(stuClasse->s.getClassName().equals(stuClasse.getClassName()))).
                collect(Collectors.toList());
        list6.forEach(stuClass -> System.out.println(stuClass));
        System.out.println("+++++++++++++++++++sorted():排序。++++++++++++++++++++++++++");
        List<Student> list7 = students.stream().sorted((s1, s2) -> {
            return s1.getClassName().compareTo(s2.getClassName());
        }).collect(Collectors.toList());
        list7.forEach(student -> System.out.println(student));
        System.out.println("+++++++++++++++++++anyMatch():集合中判断是否有一个对象符合条件。++++++++++++++++++++++++++");
        if (!students.stream().anyMatch(student -> student.getClassName().equals("3"))){
            System.out.println("不存在3班的同学");
        }else {
            System.out.println("存在3班的同学");
        }
        System.out.println("+++++++++++++++++++allMatch():集合中判断是否全部符合条件。++++++++++++++++++++++++++");
        if (!students.stream().allMatch(student -> student.getClassName().equals("1"))){
            System.out.println("全部是2班的同学");
        }else {
            System.out.println("有些不是2班的同学");
        }
        System.out.println("++++++++++++++++++noneMatch():确保集合中全部不符合条件。++++++++++++++++++++++++++");
        if (students.stream().noneMatch(student -> student.getClassName().equals("3"))){
            System.out.println("全部没有3班的同学");
        }else {
            System.out.println("有3班的同学");
        }
        System.out.println("++++++++++++++++++findAny():返回对象集合中任意一条对象。++++++++++++++++++++++++++");
        Student student1 = students.stream().filter(student -> student.getClassName().equals("3")).findAny().orElse(new Student("e","3","实验三小"));
        System.out.println(student1);
        System.out.println("++++++++++++++++++findFirst():返回对象集合中第一条对象。++++++++++++++++++++++++++");
        Student student2 = students.stream().filter(student -> student.getClassName().equals("1")).findFirst().orElse(new Student("e","3","实验三小"));
        System.out.println(student2);
        System.out.println("++++++++++++++++++forEach():遍历循环。++++++++++++++++++++++++++");
        students.stream().forEach(student -> System.out.println(student));
        System.out.println("++++++++++++++++++collect():收集器。++++++++++++++++++++++++++");
        List<Student> list8 = students.stream().collect(Collectors.toList());
        System.out.println("++++++++++++++++++count():统计集合中的数量。++++++++++++++++++++++++++");
        long count = students.stream().count();
        System.out.println("++++++++++++++++++reduce():用于接受两个参数创建一个新值。++++++++++++++++++++++++++");
        List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
        int sum = numbers.stream().reduce(0, (j, k) -> j + k);
        System.out.println(sum);
    }
}
  • 串行流/并行流
    上面通过stream方法将数据转为串行流,而通过调用parallelStream方法将数据转化为并行流,并不是使用并行流就一定比串行流块,只有在数据量大,并且cpu核数多的情况下才能体现其优势所在:
public class StreamLearn {
    public static void main(String[] args) {
        ArrayList<Demo> demos = new ArrayList<>();
        for (int i = 0; i <1000 ; i++) {
            Demo demo = new Demo();
            ArrayList<Integer> list = new ArrayList<>(10000);
            for (int j = 0; j <10000 ; j++) {
                list.add(j);
            }
            demo.setI(i);
            demo.setList(list);
            demos.add(demo);
        }
        System.out.println("开始进入遍历");
        
        demos.parallelStream().forEach(demo -> {
            demo.getList().stream().forEach(integer -> ++integer);
        });
    }
}
@Data
class Demo{
    private Integer i;
    private List<Integer> list;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358