目录
什么是Stream?
IO流:
Java8Stream:
什么是流?
stream图解
获取流
集合类,使用 Collection 接口下的 stream()
代码
数组类,使用 Arrays 中的 stream() 方法
代码
stream,使用 Stream 中的静态方法
代码
流操作
按步骤写
代码
链式调用
代码
运行
中间操作:
API
代码
运行
代码
运行
代码
运行
终端操作:
API
代码
运行
代码
运行
代码
运行
代码
运行
代码
运行
代码
运行
什么是Stream?
IO流:
输入输出文件的
Java8Stream:
处理数据集合(数组,集合类);
对数组,集合类 进行各种操作(过滤,排序......);
stream处理数据的大体过程:
数组/集合类-->流-->各种操作(排序,过滤...)-->结果。
什么是流?
数据和集合类更偏向于存储数据(各种结构);
stream更偏向于数据操作。
stream图解
获取流
获取流,把集合或者数组转化为stream对象。
集合类,使用 Collection 接口下的 stream()
代码
package com.ffyc.stream;import java.util.ArrayList;
import java.util.stream.Stream;public class Demo1 {public static void main(String[] args) { ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);//把集合转为流Stream<Integer> stream = arrayList.stream(); }
}
数组类,使用 Arrays 中的 stream() 方法
代码
package com.ffyc.stream; import java.util.Arrays;
import java.util.stream.IntStream; public class Demo1 {public static void main(String[] args) { int[] array = new int[]{1,2,3,4};//把数组转为流IntStream intStream = Arrays.stream(array); }
}
stream,使用 Stream 中的静态方法
代码
package com.ffyc.stream;import java.util.stream.Stream;public class Demo1 {public static void main(String[] args) { Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);}
}
流操作
按步骤写
代码
package com.ffyc.stream;import java.util.Arrays;
import java.util.stream.Stream;public class Demo2 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,5};Stream<Integer> stream = Arrays.stream(array);Stream stream1 = stream.filter();Stream stream2 = stream1.sorted();}
}
链式调用
代码
package com.ffyc.stream;import java.util.Arrays;
import java.util.stream.Stream;public class Demo2 {public static void main(String[] args) { long sum = Arrays.stream(array).sorted().count();}
}
运行
中间操作:
流的各种数据处理
API
filter:过滤流中的某些元素,
sorted(): 自然排序,流中元素需实现 Comparable 接口
distinct: 去除重复元素
代码
package com.ffyc.stream;import java.util.Arrays; public class Demo2 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5}; Arrays.stream(array).filter((e)->{return e<5;}).sorted((o1,o2)->{return o2-o1;}).distinct().forEach((e)->{System.out.println(e);});}
}
运行
limit(n): 获取 n 个元素
skip(n): 跳过 n 元素,配合 limit(n)可实现分页
代码
package com.ffyc.stream;import java.util.Arrays; public class Demo2 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5}; Arrays.stream(array)//跳过指定数量个元素.skip(2)//取出指定数量个元素.limit(2).forEach((e)->{System.out.println(e);}); }
}
运行
map():将其映射成一个新的元素
代码
package com.ffyc.stream;public class Student {private int num;private String name;private int age;public Student(int num, String name, int age) {this.num = num;this.name = name;this.age = age;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"num=" + num +", name='" + name + '\'' +", age=" + age +'}';}
}
package com.ffyc.stream;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;public class Demo4 {public static void main(String[] args) {Student s1 = new Student(001,"张三",18);Student s2 = new Student(002,"李四",19);Student s3 = new Student(003,"王五",29);Student s4 = new Student(004,"王麻子",21);Student s5 = new Student(005,"丽丽",19);ArrayList<Student> students = new ArrayList<>();students.add(s3);students.add(s1);students.add(s2);students.add(s5);students.add(s4); Object[] array = students.stream().map((Student::getNum))//将对象中某个属性的值映射到一个新集合中.toArray();System.out.println(Arrays.toString(array));Map<Integer, String> map = students.stream().collect(Collectors.toMap(Student::getNum, Student::getName));System.out.println(map);}
}
运行
终端操作:
把流转为最终结果(数组/集合/单值)
API
Min:返回流中元素最小值
Max:返回流中元素最大值
代码
package com.ffyc.stream;import java.util.Arrays; public class Demo3 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5};Integer max = Arrays.stream(array).distinct().max((o1, o2) -> {//最大值return o1 - o2;}).get();System.out.println(max);Integer min = Arrays.stream(array).distinct().min((o1, o2) -> {//最小值return o1 - o2;}).get();System.out.println(min);
}
运行
count:返回流中元素的总个数
代码
package com.ffyc.stream;import java.util.Arrays; public class Demo3 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5}; long count = Arrays.stream(array).distinct().count();//统计元素个数System.out.println(count); }
}
运行
Reduce:所有元素求和
代码
package com.ffyc.stream;import java.util.Arrays; public class Demo3 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5}; /long reduce = Arrays.stream(array).distinct().reduce((a,b)->{//求和return a+b;}).get();System.out.println(reduce); }
}
运行
anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足条件则返回 true,否则返回 false
allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返回 true,否则返回 false
代码
package com.ffyc.stream;import java.util.Arrays; public class Demo3 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5}; Boolean result1 = Arrays.stream(array).distinct().anyMatch((e)->{//只有有一个元素满足条件,返回truereturn e>2;});System.out.println(result1);Boolean result2 = Arrays.stream(array).distinct().allMatch((e)->{//所有的条件都满足条件,返回truereturn e>2;});System.out.println(result2); }
}
运行
findFirst:返回流中第一个元素
代码
package com.ffyc.stream;import java.util.Arrays; public class Demo3 {public static void main(String[] args) { Integer[] array = new Integer[]{1,2,3,4,2,5}; Integer result = Arrays.stream(array).distinct().findFirst().get();System.out.println(result);}
}
运行
collect:将流中的元素倒入一个集合,Collection 或 Map
代码
package com.ffyc.stream;public class Student {private int num;private String name;private int age;public Student(int num, String name, int age) {this.num = num;this.name = name;this.age = age;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"num=" + num +", name='" + name + '\'' +", age=" + age +'}';}
}
package com.ffyc.stream;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class Demo4 {public static void main(String[] args) {Student s1 = new Student(001,"张三",18);Student s2 = new Student(002,"李四",19);Student s3 = new Student(003,"王五",29);Student s4 = new Student(004,"王麻子",21);Student s5 = new Student(005,"丽丽",19);ArrayList<Student> students = new ArrayList<>();students.add(s3);students.add(s1);students.add(s2);students.add(s5);students.add(s4);List<Student> collect = students.stream().sorted((a,b)->{ //对学生对象集合进行排序,必须给定排序的规则return a.getNum()-b.getNum();}).collect(Collectors.toList());System.out.println(collect);List<Student> res = students.stream().filter((stu) -> {return stu.getAge()>18;}).collect(Collectors.toList());System.out.println(res);List<Integer> list = students.stream().map(Student::getNum).collect(Collectors.toList());System.out.println(list);}
}