java8的stream流学习(2)

本文详细介绍了Java8的Stream流的使用,包括通过集合、数组和Stream.of创建流,以及流的操作如筛选、映射、排序、终止等。通过实例展示了如何过滤、映射、排序学生数据,并进行各种流操作,如查找、匹配、规约和收集。文章旨在帮助读者深入理解Java8的新特性,提高代码编写效率。
摘要由CSDN通过智能技术生成

java8的stream流学习(2)

***前言***

之前也写过两三篇关于Stream相关的帖子,当然了,也是参考的.我感觉java8的新特性还是要深刻掌握的,因为这几个新特性的确能帮助我们让代码变得健壮,不说了,直接写案例,撸代码

参考网址:

https://mp.weixin.qq.com/s/IHkpqdRLeEPAgdPbOnxsKw

准备测试数据

实体类

package com.shaoming.stream3;


import java.util.Objects;

/**
 * @Auther: shaoming
 * @Date: 2021/1/23 14:15
 * @Description:
 */
public class Student implements Comparable<Student>{
    private Integer id;
    private String naem;
    private Integer age;
    private Double score;

    public Student() {
    }

    public Student(Integer id, String naem, Integer age, Double score) {
        this.id = id;
        this.naem = naem;
        this.age = age;
        this.score = score;
    }


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNaem() {
        return naem;
    }

    public void setNaem(String naem) {
        this.naem = naem;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", naem='" + naem + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }



    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Student)) {
            return false;
        }
        Student student = (Student) o;

        if (id != null ? !id.equals(student.id) : student.id != null) {
            return false;
        }
        if (naem != null ? !naem.equals(student.naem) : student.naem != null) {
            return false;
        }
        if (age != null ? !age.equals(student.age) : student.age != null) {
            return false;
        }
        return score != null ? score.equals(student.score) : student.score == null;
    }

    @Override
    public int hashCode() {
        int result = id != null ? id.hashCode() : 0;
        result = 31 * result + (naem != null ? naem.hashCode() : 0);
        result = 31 * result + (age != null ? age.hashCode() : 0);
        result = 31 * result + (score != null ? score.hashCode() : 0);
        return result;
    }


    @Override
    public int compareTo(Student o) {
        return Double.compare(this.getScore(),o.getScore());
    }
}

造假数据


import java.util.ArrayList;
import java.util.List;
public class StudentData {
    public static List<Student> getStudents(){
        List<Student> list=new ArrayList<Student>();
        list.add(new Student(1,"刘备",18,90.4));
        list.add(new Student(2,"张飞",19,87.4));
        list.add(new Student(3,"关羽",21,67.4));
        list.add(new Student(4,"赵云",15,89.4));
        list.add(new Student(5,"马超",16,91.4));
        list.add(new Student(6,"曹操",19,83.4));
        list.add(new Student(7,"荀彧",24,78.4));
        list.add(new Student(8,"孙权",26,79.4));
        //故意往集合里面放上两个一样的对象
        list.add(new Student(9,"鲁肃",21,93.4));
        list.add(new Student(9,"鲁肃",21,93.4));
        return list;
    } 
}

测试

测试1

创建stream流

package com.shaoming.stream3;

import org.junit.Test;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * 创建stream流
 */
public class StreamTest31 {

    /**
     * 方式一:通过一个集合创建Stream
     */
    @Test
    public void test1() {
        List<Student> studentList = StudentData.getStudents();
        //第一种,返回一个顺序流
        Stream<Student> stream = studentList.stream();
        Stream<Student> stream2 = studentList.parallelStream();
    }

    /**
     * 方式二:通过一个数组创建Stream
     */
    @Test
    public void test2() {
        int[] arr = new int[]{1, 2, 3, 4, 6};
        IntStream stream = Arrays.stream(arr);

        Student[] arrStudents = StudentData.getArrStudents();
        Stream<Student> stream1 = Arrays.stream(arrStudents);
    }

    /**
     * 方式三:通过streamof
     */
    @Test
    public void test3() {
        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);
        Stream<Student> studentStream = Stream.of(new Student(1, "刘备", 18, 90.4),
                new Student(2, "张飞", 19, 87.4),
                new Student(3, "关羽", 21, 67.4)
        );
    }
     @Test
     public void test4(){
         //每隔5个数取一个,从0开始,此时就是无限循环
//         Stream.iterate(0,t->t+5).forEach(System.out::println);
         //设置5个数取一个,从0开始,只取前5个
//         Stream.iterate(0,t->t+5).limit(5).forEach(System.out::println);
         //取出一个随机数
           Stream.generate(Math::random).limit(5).forEach(System.out::println);
     }

}

测试2

使用stream操作数据

package com.shaoming.stream3;

import org.junit.Test;

import java.lang.reflect.Array;
import java.util.*;
import java.util.stream.Stream;

/**
 * 使用stream操作数据
 */
public class StreamTest32 {
    /**
     * 操作1:筛选和切片
     */
    @Test
    public void test1() {
        List<Student> list = StudentData.getStudents();
        //(1)过滤:过滤出所有年龄大于20岁的同学
        list.stream().filter(item -> item.getAge() > 20).forEach(System.out::println);
        System.out.println();
        //(2)截断流:筛选出前3条数据
        list.stream().limit(3).forEach(System.out::println);
        System.out.println();
        //(3)跳过元素:跳过前5个元素
        list.stream().skip(5).forEach(System.out::println);
        System.out.println();
        //(4)过滤重复元素
        list.stream().distinct().forEach(System.out::println);
        System.out.println();
    }

    /**
     * 操作2:映射
     */
    @Test
    public void test2() {
        //(1)map操作
        List<String> list = Arrays.asList("java", "python", "go");
        Stream<String> stream = list.stream();
        //此时每个小写字母都有一个大写映射
        stream.map(str->str.toUpperCase()).forEach(System.out::println);
    }
    /**
     * 操作3:排序
     */
    @Test
    public void test3(){
        //(1)自然排序
        List<Integer> list = Arrays.asList(4, 3, 7, 9, 12, 8, 23, 2);
        Stream<Integer> stream = list.stream();
        stream.sorted().forEach(System.out::println);
        //(2)对象排序:对象类可以先实现comparable接口,或者直接指定
        //第一种:先实现compable接口
//        List<Student> studentList = StudentData.getStudents();
//        studentList.stream().sorted().forEach(System.out::println);
        //第二种:直接指定comparable
        List<Student> studentList1 = StudentData.getStudents();
        studentList1.stream().sorted((e1,e2)->Integer.compare(e1.getAge(),e2.getAge())).forEach(System.out::println);
    }
}

测试3

终止stream

package com.shaoming.stream3;

import com.shaoming.ifelse.StudentLevel;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 终止stream
 */
public class StreamTest33 {
    /**
     * 操纵1:匹配和查找
     */
    @Test
    public void test1() {
        List<Student> list = StudentData.getStudents();
        //(1)判断所有的学生年龄是都都大于20岁
        boolean allMatch = list.stream().allMatch(item -> item.getAge() > 20);
        //(2)判断是否存在学生的年龄大于20
        boolean anyMatch = list.stream().anyMatch(item -> item.getAge() > 20);
        //(3)判断是否存在学生叫曹操
        boolean noneMatch = list.stream().noneMatch(item -> item.getNaem().equalsIgnoreCase("曹操"));
        //(4)查早第一个学生
        Optional<Student> first = list.stream().findFirst();
        Student student = first.get();
        Optional<Student> first1 = list.stream().sorted
                ((e1, e2) -> Double.compare(e1.getScore(), e2.getScore())).collect(Collectors.toList()).stream().findFirst();
        Student student1 = first1.get();
        System.out.println(student);
        System.out.println(student1);
        //(5)查找所有学生的数量
        long count = list.stream().count();
        long count1 = list.stream().filter(item -> item.getScore() > 90).count();
        //(6)查找当前流中的元素
        Optional<Student> any = list.stream().findAny();
        //(7)查找学生最高的分数:Student实现了comparable接口的话,可直接比较
        Stream<Double> doubleStream = list.stream().map(item -> item.getScore());
    }

    /**
     * 自定义比较器
     */
    @Test
    public void test2222() {
        List<Student> list=new ArrayList<Student>();
        list.add(new Student(1,"刘备",18,90.4));
        list.add(new Student(1,"刘备",19,90.4));
        list.add(new Student(1,"刘备",20,80.4));
         list.stream().sorted
                ((e1, e2) -> {
                    if (e1.getScore().equals(e2.getScore())) {
                        return Integer.compare(e1.getAge(), e2.getAge());
                    } else {
                        return -Double.compare(e1.getScore(), e2.getScore());
                    }
                }).collect(Collectors.toList()).forEach(System.out::println);
        System.out.println();
    }
    /**
     * 操作2:规约
     */
    @Test
    public void test2(){
        //(1)计算数的总和
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        Integer sum = list.stream().reduce(0, Integer::sum);
        System.out.println("总和为: "+sum);
        //(2)计算学生总分
        List<Student> studentList = StudentData.getStudents();
        Stream<Double> doubleStream = studentList.stream().map(Student::getScore);
        Optional<Double> scoreSum = doubleStream.reduce(Double::sum);
        System.out.println("分数的总和为:"+scoreSum);
    }
    /**
     * 操作3:收集
     */
    @Test
    public void test3(){
        List<Student> studentList = StudentData.getStudents();
        //返回一个list集合
        studentList.stream().filter(e->e.getAge()>18).collect(Collectors.toList()).forEach(System.out::println);
        System.out.println();
        //返回一个set
        studentList.stream().filter(e->e.getAge()>18).collect(Collectors.toSet()).forEach(System.out::println);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值