Stream流操作是java8的最重要的新特性之一,功能强大,非常常用。可以说每个java coder必须掌握,这次把理论放在最后面,因为你可能不需要知道的多么详细,只是需要看看某个功能,可能听名字就大概知道它是做什么的。
举个简单例子,现在给了你同学信息和成绩,你需要统计班级平均分
// 以前可能的做法
public static avgScore(List<Student> stus){
int sum=0;
for (Student student : stus) {
int core = student.core;
sum += core;
}
return ((double)sum / stus.size());
}
// 有了Stream后,
public static Double avgScore(List<Student> stus){
OptionalDouble average = stus.stream().mapToDouble(stu -> stu.core).average();
return average.getAsDouble();
}
流的一些操作:
filter
filter
过滤操作,只返回满足条件的数据
filter
返回的流中只包含满足断言(predicate
)的数据
//输出学生数组中,成绩大于80的学生
public static void sFilter(List<Student> stus){
stus.stream()
.filter(student -> student.getCore()>80)
.forEach(System.out::println);
}
distinct
distinct
输出的流中彼此不同的元素,通过Object.equals(Object)
来检查是否包含相同的元素。
//从数组中找出不同的对象
public static void sDistinct(List<Student> stus){
stus.stream()
.distinct()
.forEach(System.out::println);
}
map、peek与forEach对比
map
可以对流中每一个的元素执行操作返回一种元素(可以相同),可以用来做元素转换
peek
通常用于debug,会通过Consumer对流操作,但操作结果不返回Stream中。
forEach
与map
和peek
类似,但由于不会返回元素,forEach的返回值是void,可以看做是流的终点操作
//map,从Student数组中获取由name组成的数组
public static void sMap(List<Student> stus){
List<String> collect = stus.stream()
.map(student -> student.getName())
.collect(Collectors.toList());
stus.forEach(System.out::println);
collect.forEach(System.out::println);
}
//forEach,将Student数组中的成绩属性全部加1
public static void sForEach(List<Student