网站首页 > 精选文章 正文
背景
项目开发中,先进的同事们使用了Java8提供的stream流,好处是:代码确实简洁了,少敲不少的字母,不好处是:对基础知识不扎实的、对stream流不熟练的,就会理解起来比较困难,更有甚者是使用了不能精准的知道处理过程以及原理。
项目中,当开发人员水平参差不齐时,还是不推荐使用,不过一切都在发展中,做以下例子便于真正的理解。
Stream处理过程:
+--------------------+ +----------+ +---------+ +-----+ +----------+
| stream of elements +-----> |filter+ -> |sorted+-> |map+-> |collect|
+--------------------+ +----------+ +---------+ +-----+ +----------+
生成流:
1、stream() ,为集合创建串行流。
2、parallelStream(),为集合创建并行流。
常使用的方法:
forEach(),迭代流中的每个数据。
map(),用于映射每个元素到对应的结果。
filter(),用于通过设置的条件过滤出元素。
limit(),用于获取指定数量的流。
sorted(),用于对流进行排序。
findFirst(),返回列表中的第一个元素。
findAny(),返回的元素是不确定的,对于同一个列表多次调用findAny()有可能会返回不同的值,使用findAny()是为了更高效的性能。
Collectors类:
实现了很多归约操作,如将流转换成集合和聚合元素,Collectors可用于返回列表或字符串。
代码
import lombok.Data;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class ObjectListTransform {
@Data
static class User {
private Integer id;
private String name;
private int type;
}
/**
* @param list
*/
private static void streamForForEach(List list) {
list.forEach(System.out::println);
list.forEach(e -> System.out.println(">>>> " + e));
// 等价于
for (Object o : list) {
System.out.println(o);
}
}
/**
* @param userList
* @return
*/
private static List<Integer> streamForMap(List<User> userList) {
// map()方法用于映射每个元素到对应的结果
List<Integer> idList = userList.stream().map(user -> {
return user.getId();
}).collect(Collectors.toList());
return idList;
}
/**
* 过滤
*
* @param userList
* @return
*/
private static List<User> streamForFilter(List<User> userList) {
// filter()方法用于通过设置的条件过滤出元素
List<User> idList = userList.stream().filter(user -> {
if (user.getType() == 1) {
return true;
}
return false;
}).collect(Collectors.toList());
return idList;
}
public static void main(String[] args) {
// 构造数据
List<User> userList = new ArrayList<>();
for (int i = 1; i <= 20; i++) {
User user = new User();
user.setId(i);
user.setName("name" + i);
user.setType(i % 2);
userList.add(user);
}
// map()方法用于映射每个元素到对应的结果
streamForForEach(streamForMap(userList));
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
// filter()方法用于通过设置的条件过滤出元素
streamForForEach(streamForFilter(userList));
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
// limit()方法用于获取指定数量的流
// 打印10条
userList.stream().limit(5).forEach(System.out::println);
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
// sorted()方法用于对流进行排序
userList.stream().sorted(new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
// 根据ID倒序排列
if (o1.getId() > o2.getId()) {
return -1;
} else if (o1.getId() < o2.getId()) {
return 1;
}
return 0;
}
}).forEach(user -> {
System.out.println("sorted->" + user);
});
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
// sorted()方法用于对流进行排序
userList.stream().sorted((user1, user2) -> {
// 根据ID倒序排列
if (user1.getId() > user2.getId()) {
return 1;
} else if (user1.getId() < user2.getId()) {
return -1;
}
return 0;
}).forEach(user -> {
System.out.println("sorted->" + user);
});
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
// 获取第一个
User user = userList.stream().findFirst().get();
System.out.println("user->" + user);
User user2 = userList.parallelStream().findFirst().get();
System.out.println("user->" + user2);
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
// 取第一个
User user3 = userList.stream().findAny().get();
System.out.println("user->" + user3);
User user4 = userList.parallelStream().findAny().get();
System.out.println("user->" + user4);
}
}
- 上一篇: 详解 Python Map 函数
- 下一篇: Python核心技术——高阶函数:map()函数
猜你喜欢
- 2024-12-23 JavaScript数组之map、filter、reduce使用详解
- 2024-12-23 通俗易懂的说mapreduce
- 2024-12-23 Javascript中,forEach和map到底有什么区别?
- 2024-12-23 Go 每日一库之 mapstructure
- 2024-12-23 python的map函数
- 2024-12-23 golang常用数据结构之map详细讲解
- 2024-12-23 C++的map用法
- 2024-12-23 java的map是什么_java中的map是什么
- 2024-12-23 java如何对map进行排序详解(map集合的使用)
- 2024-12-23 js 如何定义map及赋值
- 最近发表
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)