网站首页 > 精选教程 正文
背景
项目开发中,先进的同事们使用了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);
}
}
猜你喜欢
- 2025-01-11 JVM系列-使用jmap和MAT进行堆内存分析
- 2025-01-11 MapStruct 使用教程, 万字详解
- 2025-01-11 面试官:ThreadLocal中的ThreadLocalMap和HashMap有什么区别?
- 2025-01-11 Golang入门专题-Map
- 2025-01-11 Golang Gin 实战(五)| 接收数组和 Map
- 2025-01-11 Hadoop :map+shuffle+reduce和YARN分析笔记
- 2025-01-11 MapStruct架构设计
- 2025-01-11 由 Mybatis 源码畅谈软件设计(五):ResultMap 的循环引用
- 2025-01-11 Map扩展,敏捷的SmartMap
- 2025-01-11 一日一技:举例说明python中的map()方法
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)