班级类
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;
}
网友评论