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