使用
集合条件筛选。
提供了一种对 Java 集合运算和表达的高阶抽象,类似于SQL查询。
可以在List中匹配所需的对象,并且存储到新的List中。
以下是查找年龄小于24的对象:
import lombok.Data;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author QZP
* Created on 2024/4/17$
*/
public class streamTest {
public static void main(String[] args) {
Student s1 = new Student("邱泽鹏", 24, 1);
Student s2 = new Student("qzp", 26, 1);
List<Student> list_Student = new ArrayList<>();
list_Student.add(s1);
list_Student.add(s2);
// 打印:年龄:24, 姓名:邱泽鹏, 性别:1
// 年龄:26,姓名:qzp, 性别:1
for(Student s_iter:list_Student){
System.out.println(s_iter.toString());
}
// s可以理解为Student类型的一个对象,会在list_Student中循环。
List<Student> StudentList = list_Student.stream().filter(s->s.getAge()<=24).collect(Collectors.toList());
// 打印:年龄:24, 姓名:邱泽鹏, 性别:1
for(Student s_iter:StudentList){
System.out.println(s_iter.toString());
}
}
}
@Data
class Student{
String name;
int age;
int sex;
public Student(String name, int age, int sex) {
this.age=age;
this.name=name;
this.sex=sex;
}
@Override
public String toString(){
return String.format("年龄:%s, 姓名:%s, 性别:%s", age, name, sex);
}
}
原理
参考自:https://github.com/CarpenterLee/JavaLambdaInternals/blob/master/4-Streams%20API(I).md
stream不是一种数据结构,而是数据源(数组、Java容器、I/O channel)的一种视图。其思想是以一种更友好的方式,实现简洁的代码。
无存储:stream不存储数据,对其修改都不会修改数据源(比如对其不符合的数据进行过滤)。
一次性:stream是一次性的,遍历完结束就会失效。这跟迭代器一样。
惰性:stream中的操作不会立即执行,只有当用户需要结果时再执行。这与触发类加载相似。
方法
转变
想使用stream的API需要将数据转变为Stream类型。JDK8提供了.stream()进行转变。
.collect(Collectors.toList()),同样可以传递:
Collectors.toList() | .toSet()等等。
stream本质还是用于迭代筛选。对应的方法可以分为两类,一是筛选的中间过程,而是结束操作。
中间操作 | concat() distinct() filter() flatMap() limit() map() peek() skip() sorted() parallel() sequential() unordered() |
结束操作 | allMatch() anyMatch() collect() count() findAny() findFirst() forEach() forEachOrdered() max() min() noneMatch() reduce() toArray() |
forEach:stream可以使用forEach方法进行遍历。Lambda表达式使其代码更加简洁。
public class streamTestMethod {
public static void main(String[] args) {
Stream<String> stream = Stream.of("Qiu", "Ze", "peng");
stream.forEach(str -> System.out.println(str));
}
}
filter:筛选器。作用是筛选出符合条件的对象。
public class streamTestMethod {
public static void main(String[] args) {
Stream<String> stream = Stream.of("Qiu", "Ze", "peng");
stream.filter(str->str.length()==2).forEach(str -> System.out.println(str));
// output: Ze
}
}
distinct:去重
public class streamTestMethod {
public static void main(String[] args) {
Stream<String> stream = Stream.of("Qiu", "Ze", "peng", "Ze");
stream.distinct().forEach(str -> System.out.println(str));
// output: Qiu
//Ze
//peng
}
}
sorted():排序
其中 str1.length()-str2.length()代表按降序排序。
Stream<String> stream= Stream.of("I", "love", "you", "too");
stream.sorted((str1, str2) -> str1.length()-str2.length())
.forEach(str -> System.out.println(str));
map():转换
如果相对数据进行处理,需要使用map进行转换。
Stream<String> stream = Stream.of("I", "love", "you", "too");
stream.map(str -> str.toUpperCase())
.forEach(str -> System.out.println(str));
flatMap():将多个list合并成一个。
————————————待续