参考
建议
建议在看 stream 之前,先学习 Java 的 Lambda
与 函数式接口。Java 四大函数式接口(函数型/断定型/消费型/供给型)
代码
简单使用
package stream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
/**
* @Author 夏秋初
* @Date 2022/3/4 10:34
*/
public class Test1 {
public static void main(String[] args) {
User user1 = new User("张三", 18, "爱学习", "zhangsan");
User user2 = new User("李四", 23, "爱工作", "lisi");
User user3 = new User("王五", 30, "爱家庭", "wangwu");
User user4 = new User("马六", 10, "爱玩", "maliu");
User user5 = new User("赵七", 18, "不爱学习", "zhaoqi");
List<User> userList = Arrays.asList(user1, user2, user3, user4, user5);
// 返回此流中元素的数量
System.out.println(userList.stream().count());
System.out.println("==count==");
// 对此流的每个元素执行操作
userList.stream().forEach(item->System.out.println(item));
System.out.println("==forEach==");
// 返回由与此给定谓词匹配的此流的元素组成的流
userList.stream().filter(item->item.age > 22).forEach(item->System.out.println(item));
System.out.println("==filter==");
// 返回Optional描述流的一些元件,或一个空Optional如果流是空的。
System.out.println(userList.stream().findAny());
System.out.println("==findAny==");
// 返回Optional描述此流的第一个元素,或空Optional如果流是空的。
System.out.println(userList.stream().findFirst());
System.out.println("==findFirst==");
// 返回由此流的元素组成的流,截断长度不超过 maxSize 。
userList.stream().limit(2).forEach(item->System.out.println(item));
System.out.println("==limit==");
// 返回一个流,该流包含将给定函数应用于此流的元素的结果。
userList.stream().map(item-> item.englishName.toUpperCase()).forEach(item->System.out.println(item));
System.out.println("==map1==");
userList.stream().map(item->{
item.englishName = item.englishName.toUpperCase();
return item;
}).forEach(item->System.out.println(item));
System.out.println("==map2==");
// 返回由此流的元素组成的流,另外在每个元素上执行提供的操作,因为元素是从结果流中消耗的。
userList.stream().peek(item->{
// item.age = 18;
}).forEach(item->System.out.println(item));
System.out.println("==peek==");
}
}
class User{
public String name;
public Integer age;
public String desc;
public String englishName;
public User(String name, Integer age, String desc, String englishName) {
this.name = name;
this.age = age;
this.desc = desc;
this.englishName = englishName;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", desc='" + desc + '\'' +
", englishName='" + englishName + '\'' +
'}';
}
}
输出
5
==count==
User{name='张三', age=18, desc='爱学习', englishName='zhangsan'}
User{name='李四', age=23, desc='爱工作', englishName='lisi'}
User{name='王五', age=30, desc='爱家庭', englishName='wangwu'}
User{name='马六', age=10, desc='爱玩', englishName='maliu'}
User{name='赵七', age=18, desc='不爱学习', englishName='zhaoqi'}
==forEach==
User{name='李四', age=23, desc='爱工作', englishName='lisi'}
User{name='王五', age=30, desc='爱家庭', englishName='wangwu'}
==filter==
Optional[User{name='张三', age=18, desc='爱学习', englishName='zhangsan'}]
==findAny==
Optional[User{name='张三', age=18, desc='爱学习', englishName='zhangsan'}]
==findFirst==
User{name='张三', age=18, desc='爱学习', englishName='zhangsan'}
User{name='李四', age=23, desc='爱工作', englishName='lisi'}
==limit==
ZHANGSAN
LISI
WANGWU
MALIU
ZHAOQI
==map1==
User{name='张三', age=18, desc='爱学习', englishName='ZHANGSAN'}
User{name='李四', age=23, desc='爱工作', englishName='LISI'}
User{name='王五', age=30, desc='爱家庭', englishName='WANGWU'}
User{name='马六', age=10, desc='爱玩', englishName='MALIU'}
User{name='赵七', age=18, desc='不爱学习', englishName='ZHAOQI'}
==map2==
User{name='张三', age=18, desc='爱学习', englishName='ZHANGSAN'}
User{name='李四', age=23, desc='爱工作', englishName='LISI'}
User{name='王五', age=30, desc='爱家庭', englishName='WANGWU'}
User{name='马六', age=10, desc='爱玩', englishName='MALIU'}
User{name='赵七', age=18, desc='不爱学习', englishName='ZHAOQI'}
==peek==
进程已结束,退出代码为 0
结合使用
注意:如果排序的话,User
类需要实现 Comparable
接口。
package stream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
/**
* @Author 夏秋初
* @Date 2022/3/4 10:34
*/
public class Test1 {
/**
*
* @param args
*/
public static void main(String[] args) {
User user1 = new User("张三", 18, "爱学习", "zhangsan");
User user2 = new User("李四", 23, "爱工作", "lisi");
User user3 = new User("王五", 30, "爱家庭", "wangwu");
User user4 = new User("马六", 10, "爱玩", "maliu");
User user5 = new User("赵七", 18, "不爱学习", "zhaoqi");
List<User> userList = Arrays.asList(user1, user2, user3, user4, user5);
userList.stream()
// 筛选年龄大于10岁
.filter(item->item.age>10)
// 将英文名大写
.peek(item->item.englishName = item.englishName.toUpperCase())
// 正序排序
.sorted((item1, item2)->item1.compareTo(item2))
// 倒序排序
.sorted((item1, item2)->item2.compareTo(item1))
// 取出指定长度
.limit(3)
// 对每个元素执行打印
.forEach(item->System.out.println(item));
}
}
//
class User implements Comparable<User>{
public String name;
public Integer age;
public String desc;
public String englishName;
public User(String name, Integer age, String desc, String englishName) {
this.name = name;
this.age = age;
this.desc = desc;
this.englishName = englishName;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", desc='" + desc + '\'' +
", englishName='" + englishName + '\'' +
'}';
}
@Override
public int compareTo(User o) {
if(this.age > o.age){
return 1;
}
if(this.age < o.age){
return -1;
}
return 0;
}
}
输出
User{name='王五', age=30, desc='爱家庭', englishName='WANGWU'}
User{name='李四', age=23, desc='爱工作', englishName='LISI'}
User{name='张三', age=18, desc='爱学习', englishName='ZHANGSAN'}
进程已结束,退出代码为 0