目录
什么是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;
}
@Override
public 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)->{//只有有一个元素满足条件,返回true
return e>2;
});
System.out.println(result1);
Boolean result2 = Arrays.stream(array)
.distinct()
.allMatch((e)->{//所有的条件都满足条件,返回true
return 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;
}
@Override
public 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);
}
}