美文网首页
Java8---stream()方法的使用

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

作者: 那就省略号吧 | 来源:发表于2020-08-03 18:03 被阅读0次

班级类

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;
}

相关文章

网友评论

      本文标题:Java8---stream()方法的使用

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