Java Stream API
1. 基本概念
可以声明式方式处理数据集合的流
常用的操作有:过滤、映射、规约等
2.实用总结
2.1.创建
- 从集合中创建Stream
点击查看代码
//1. 从集合中构建Stream
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
Stream<String> stream = list.stream();
stream.forEach(System.out::println);
- 从数组中构建Stram
点击查看代码
//2. 从数组中构建Stream
String[] array = new String[]{"a", "b", "c", "d", "e"};
Stream<String> stream = Arrays.stream(array);
stream.forEach(System.out::println);
- 从Streama.of中狗i按Stream
点击查看代码
//3. 从Stream中构建Stream
Stream<String> stream = Stream.of("a", "b", "c", "d", "e");
stream.forEach(System.out::println);
- 创建无限Stream
点击查看代码
//4. 创建无限Stream
Stream.iterate(0, n -> n + 3).limit(10).forEach(System.out::println);
2.2 常规操作
- 过滤:使用filter过滤满足条件的元素
public class StreamDemo {
static class Student {
private String name;
private int age;
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{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
private static List<Student> genStudents() {
List<Student> students = new ArrayList<>();
for (int i = 0; i < 100; i++) {
Student student = new Student();
student.setAge(i);
student.setName("name" + i);
students.add(student);
}
return students;
}
}
//1. 过滤
List<Student> students = genStudents();
students.stream().filter(student -> student.getAge() > 30).forEach(System.out::println);
-映射:map
//2. 映射
List<Student> students = genStudents();
// 30岁以上的年龄都加10,名字都加上后缀hello
students.stream().filter(item->item.age>30).map(student -> {
student.setAge(student.getAge() + 10);
student.setName(student.getName() + "hello");
return student;
}).forEach(System.out::println);

- 归约:reduce
//3. 归约
List<Student> students = genStudents();
// 求年龄总和 利用map将学生的年龄都映射出来,再利用reduce归约求和
Integer ageSum = students.stream().map(Student::getAge).reduce(0, (a, b) -> a + b);
System.out.println(ageSum);

- 排序:sorted
//4. 排序
List<Student> students = genStudents();
students.stream().sorted((s1, s2) -> s2.age - s1.age).forEach(System.out::println);


浙公网安备 33010602011771号