Java8 中引入了Stream流的概念,也有许多相关Stream API 提供我们使用, 通过Stream流操作集合,这样使得我们对集合的操作更加方便,对集合的操作效率会变的更高一些。 因为在以前使用的for 循环操作结合都是外部迭代,现在使用Stream流操作集合都是内部迭代,这样效率会更高。
一、 流操作的基本步骤:
1. 创建流 Stream
创建Stream的四种方式
1. 可以通过 Collection 系列集合提供的 stream() 或 parallelStream()
Stream s = list.stream();
2. 通过Arrays 中的静态方法 Stream () 方法获取Stream
3. 通过 Stream 中的静态方法 of() 方式 获取得到Stream
Stream <String> stream =Stream.of("");
4. 创建无限流
// 迭代
Stream.iterate(起始值, 操作)
2. 对流进行中间一系列的操作
1. 筛选与操作
filter-----接受Lambda ,从流中排除某些元素
limit----越断流, 使其元素不超过给定的数量
skip(n) ---跳过元素,返回一个扔掉了前n 个元素的流,若流元素中不足n个,则返回一个空流。
与limit(n) 互补
distinct----筛选 ,通过流所生成元素hashCode() 和equals() 去除重复元素
2. 映射
map -----接受Lambda, 将元素转换成其他形式或提取元素,接受一个函数作为参数,该函数会被应用到每个元素上,
并将其映射成一个新的元素
flatMap: 接受一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
3.查找和匹配
Stream API通过allMatch、anyMatch、noneMatch、findFirst和findAny
4. 排序
sorted() ---自然排序(Comparable)
sorted(Comparator com ) ---定制排序(Comparator)
3. 终止操作
规约与收集
reduce( ) 将流中元素反复结合起来,得到一个值
collect() 将流转换为其他形式,接受一个Collector接口的实现,用于Stream中元素做汇总的方法
二、 代码示例
1. 创建实体类
public class LineContent {
public double id;
public int page;
public float x;
public float y;
public String text;
public LineContent(String text) {
this.text = text;
}
public LineContent( float x, float y, String text) {
this.x = x;
this.y = y;
this.text = text;
}
public LineContent(double id, int page, float x, float y, String text) {
this.id = id ;
this.page = page;
this.x = x;
this.y = y;
this.text = text;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public double getId() {
return id;
}
public void setId(double id) {
this.id = id;
}
@Override
public String toString() {
return "LineContent{" +
"page=" + page +
", x=" + x +
", y=" + y +
", text='" + text + '\'' +
'}';
}
}
2. 对应的list集合数据,在这里用图片显示
3. Java8 Stream 流对集合的操作
Collection
3.1 过滤 选择list 集合中对象某个属性值大于,或者小于代码
// 过滤得到X 值大于200的放入到一个新的集合
List<LineContent> rightLineContentList = lineContents
.stream()
.filter(o -> o.getX() > 200)
.collect(Collectors.toList());
3.2 截取和越断
//截取List集合中前n 个元素
List<LineContent> newList =lineContents.stream().limit(5).collect(Collectors.toList());
// 越断List 集合中最后的几个元素
index = lineContents.size()- 5;
rightLineContentList = (lineContents.stream().skip(index).collect(Collectors.toList()));
3.3 排序
// 自定义排序,通过Y坐标逆排序
List<LineContent> newList = lineContents.stream().sorted(Comparator.comparingDouble(LineContent::getY).reversed()).collect(Collectors.toList());
3.4 遍历将Map集合的Value 存放到list集合中
List<String> leftList = leftContentMap.entrySet().stream().map(o -> o.getValue()).collect(Collectors.toList());