java8新特性之Stream流操作
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> stus){
stus.stream()
.forEach(student -> {
student.setCore(student.getCore()+1);
});
stus.forEach(System.out::println);
}
peek和map的区别,在后面的理论中会对其原理做解释
// peek
IntStream.range(1,5).boxed().peek(i-> {
i=i+1;
}).forEach(System.out::print);
// 输出结果 1234
//map
IntStream.range(1,10).boxed().map(i-> i+1)
.forEach(System.out::print);
// 输出结果 2345
可见peek中虽然对i进行+1操作,但没有改变源数据
flatMap
扁平化处理流,flatMap和map类似,但flatMap转换返回的是Stream对象,而map返回的是数据源的对象,flatMap会把返回的Stream对象中的元素压缩到一起,最后回到原来的流中
Map<String, List<Integer>> map = new LinkedHashMap<>();
map.put("a", Arrays.asList(1, 2, 3));
map.put("b", Arrays.asList(4, 5, 6));
List<Integer> allValues = map.values() // Collection<List<Integer>>
.stream() // Stream<List<Integer>>
.flatMap(List::stream) // Stream<Integer>
.collect(Collectors.toList());
System.out.println(allValues);
- 点赞
- 收藏
- 关注作者
评论(0)