文章目录
- stream流简介
- 一、为什么要使用流?
- 二、主要用法
- 1.forech
- 2.filter
- 3.map
- 小结
stream流简介
stream流操作是Java 8新添加的一个重要特性,它支持顺序和并行聚合操作的元素序列。在java提供的api中举了这样一个例子:widgets是我们定义的一个集合Collection< Widget >。我们可以通过Collection.stream()创建一个Widget对象流,对其进行过滤以生成一个仅包含红色小部件的流,然后将其转换为一个表示每个红色小部件权重的int值流。最后求和,得到总重量。
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum();
一、为什么要使用流?
对于面的例子,我们不使用stream流,遍历一遍widgets集合也可以计算红色部件的总重量,为什么偏偏要用它呢。遍历很明显的一个缺点就是:对于不同的操作(例如筛选红色部件与求和操作),我们都要遍历一遍集合。然而使用stream流就可以高效简洁地处理这个问题。
流不提供直接访问或操作其元素的方法,而是关注于声明性地描述它们的源和将在该源上聚合执行的计算操作。简单点说就是我们可以使用流提供的方法来优雅地处理集合元素。
二、主要用法
stream流的方法有很多,依据是否可以在流过程中执行分为中间操作(intermediate operation)和终端操作(terminal operation),这里只介绍一些常见用法。
1.forech
对流中的每个元素执行一个操作,属于终端操作。
void forEach(Consumer<? super T> action)
举个例子:现有一个User类,包含id(long型),userName以及sex属性。想通过stream流的方式打印输出每个userName值。
public class myStream {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
users.add(new User(001,"小明","男"));
users.add(new User(002,"小李","男"));
users.add(new User(003,"晓丽","女"));
users.add(new User(004,"小花","女"));
users.stream().forEach( user-> System.out.println(user.userName));
}
}
2.filter
筛选出符合lambda表达式的集合元素,以流的形式返回,属于中间操作。
Stream<T> filter(Predicate<? super T> predicate)
举例:还是刚才的那个例子,现在想通过stream流筛选出性别为女的用户,然后打印输出这些用户的姓名。
users.stream().filter( s-> s.sex == "女").forEach( s-> System.out.println(s.userName));
3.map
返回一个流,其中包含将给定函数应用于该流中的元素的结果,属于中间操作。
<R> Stream<R> map(Function<? super T,? extends R> mapper)
举个例子:有一个String类型的list,并添加一些元素,代码如下,现想将list中每个元素的字母部分去掉,并保存到集合中。
代码如下:
List<String> list = new ArrayList<>();
list.add("aa111");
list.add("bb222");
list.add("cc333");
list.add("dd444");
list = list.stream().map((item) -> {
item = item.substring(2);
return item;
}).collect(Collectors.toList());
小结
集合和流虽然表面上有一些相似之处,但目标不同。集合主要涉及对其元素的有效管理和访问。
时间关系,今天先总结到这里,后续会加一些方法进来,如有错误,还望指正。