Android 中Stream 的使用
Steam的使用,会使你告别繁琐的for循环,一句代码搞定集合中数据的提取,
使你的代码更简洁,优雅。
一、使用的包名
由于Stream在Android中使用时,SDK必须大于24才能使,这样导致小于24的没法使用。
什么玩意?好不容易学会一个书写格式还不兼容,这可如何是好,哈哈哈,看我的,通顺的不大鸟啊,来走起。
首先在app\build.gradle中添加引用的库;如下:
implementation 'com.annimon:stream:1.2.1'
二、具体的使用
1、获取集合中符合条件的数据集合
比如你有一个Person.java类,如下
public class Person {
private int age;
private String name;
private boolean check;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isCheck() {
return check;
}
public void setCheck(boolean check) {
this.check = check;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
", check=" + check +
'}';
}
}
从集合ArrayList中获取age>20 的数据集,代码如下:
ArrayList<Person> arrayList = new ArrayList<>();
List<Person> ages = Stream.of(arrayList).
filter(person -> person.getAge() > 20).
collect(Collectors.toList());
2、从集合中获取符合条件的字段集合
从ArrayList里获取姓名的集合。
ArrayList<Person> arrayList = new ArrayList<>();
List<String> names = Stream.of(arrayList)
.map(Person::getName)
.collect(Collectors.toList());
3、将Person集合ArrayList转化成User集合
User.java 如下:
public class User {
private String name;
public User(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
取出Person类中name重新构建成User的结合:
List<User> userList = Stream.
of(arrayList).
map(person -> new User(person.getName())).
collect(Collectors.toList());
Sream返回的结果是List集合,如果你需要ArrayList集合,只需要强转类型即可。
如:
ArrayList<String> names = (ArrayList<String>) Stream.of(arrayList)
.map(Person::getName)
.collect(Collectors.toList());
三、注意
在导包的时候,要导如下:
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
四、Stream的其他函数
什么是 Stream?
Stream(流)是一个来自数据源的元素队列并支持聚合操作
元素是特定类型的对象,形成一个队列。
- Java中的Stream并不会存储元素,而是按需计算。
- 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
- 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
和以前的Collection操作不同, Stream操作还有两个基础的特征: - Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
- 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。
Stream 函数方法不多,根据自己的需要可以看,左边都有给相应的例子,告诉你怎么写了。