中间操作:返回一个新的stream
操作 | 描述 | 操作参数 | 函数描述符 |
---|---|---|---|
filter | 过滤元素 | Predicate<T> | T->boolean |
map | 对流元素操作生成一个新元素组成的流 | Function<T,R> | T->R |
flatMap | 对流每个元素本身就是一个流,那该操作将所有流合并到一起 | ||
limit | 截取前n个元素 | ||
skip | 丢弃前n个元素 | ||
sorted | 排序 | Comparator<T> | (T,T)->int |
distinct | 去重 |
终端操作:结束并返回结果
操作 | 描述 |
---|---|
forEach | 遍历流中的每一个元素,并根据lamba消费它 |
count | 返回流中元素的个数 |
collect | 将流中元素归约为一个集合并返回,如List,Map |
anyMatch/allMatch/noneMatch | 返回boolean。Predicate<T>,T->boolean |
findAny/findFirst | 返回Optional<T> |
reduce | 从一组值中生成一个值,需要给定一个初始值,然后它会根据lamba无限迭代操作 |
举个使用StreamAPI的例子:
从一个唱片集albums(一个albums里面有很多tracks)里面找出长度大于一分钟的歌曲放入结果Set中。
以前的写法:
public Set<String> findLongTrcks(List<Album> albumList) {
Set<String> result = new HashSet<>();
for (Album album: albumList) {
for(Track track:album.getTrackLists()) {
if(track.getLength()>60) {
result.add(track.getName());
}
}
}
return result;
}
使用Stream的写法:
public Set<String> findLongTrcks(List<Album> albumList) {
return albumList.stream()
.flatMap(Album->Album.getTrackLists())
.filter(track->track.getLength>60)
.map(track->track.getName())
.collect(Collectors.toSet());
}
网友评论