我们首先看一下JDK文档中对Stream的介绍
那么Stream到底是什么了?
Stream是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
“集合讲的是数据,流讲的是计算!”
Stream 的特点
- Stream 自己不会存储元素。
- Stream 不会改变源对象,相反,他们会返回一个持有结果的新Stream。
- Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
Stream数据流的基本操作
代码测试
在这之前你有必要先了解四大函数式接口,因为Stream的底层就是这些函数式接口。
User实体
package com.zhang.stream;
public class User {
private int id;
private String name;
private int age;
public User() {
}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
Stream流
package com.zhang.stream;
import java.util.Arrays;
import java.util.List;
/**
* 题目要求:
* 现在有5个用户进行筛选
* 1、ID必须是偶数
* 2、年龄必须大于23岁
* 3、用户名转换成大写
* 4、用户名倒序
* 5、只能输出一个用户
* */
public class Test {
public static void main(String[] args) {
User u1 = new User(1, "a", 20);
User u2 = new User(2, "b", 25);
User u3 = new User(3, "c", 27);
User u4 = new User(4, "d", 21);
User u5 = new User(5, "e", 22);
//集合就是存储
List<User> users = Arrays.asList(u1, u2, u3, u4, u5);
/** 1. 首先我们需要将 list 转化为stream流
* 2. 然后将用户过滤出来,这里用到一个函数式接口Predicate<? super T>,我们可 以使用lambda表达式简化
* 3. 这里面传递的参数,就是Stream流的泛型类型,也就是User,所以,这里可以直接 返回用户id为偶数的用户信息;
* * 4. 通过forEach进行遍历,直接简化输出 System.out::println ,等价于 System.out.println(u); **/
//计算交给Stream
// 链式编程
users.stream()
.filter(u->{return u.getId()%2==0;})
.filter(u->{return u.getAge()>20;})
.map(u->{return u.getName().toUpperCase();})
.sorted((uu1,uu2)->{return uu2.compareTo(uu1);}) // //sorted() 自然排序,正排序 D->E
.limit(1)
.forEach(System.out::println);
}
}