网站首页 > 技术文章 正文
Java 和 kotlin 的降维方法
在很多时候都会遇到一个问题,一个集合中包含多个集合,但是又要统一添加到一个中,也就是俗称的降维(把二维数组降成一维数组)
前提(这里使用的lombok 省略了get、set、有参、无参和toString方法,没有的需要手动快捷键生成对应的方法哦):
User.class
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
private Long id;
private String username;
}
jdk版本 1.8
idea 对用的快捷键:Alt + Insert
Java
Spring boot的测试类:
@SpringBootTest
class UserServerApplicationTests {
@Test
void contextLoads() {
List<List<User>> lists = new ArrayList<List<User>>();
for (int i = 0; i < 3; i++) {
List<User> list = new ArrayList<>();
for (int j = 0; j < 3; j++) {
User user = new User();
user.setUsername("小黑呀" + i + "-" + j);
list.add(user);
}
lists.add(list);
}
//代码都是拆自这,下面的代码直接粘贴到这就可以了
}
}
调用方法前的参数:
[[User(id=null, username=小黑呀0-0), User(id=null, username=小黑呀0-1), User(id=null, username=小黑呀0-2)], [User(id=null, username=小黑呀1-0), User(id=null, username=小黑呀1-1), User(id=null, username=小黑呀1-2)], [User(id=null, username=小黑呀2-0), User(id=null, username=小黑呀2-1), User(id=null, username=小黑呀2-2)]]
方案有几种:普通for循环(不做了解)、forEach方法、Lambda 函数。
forEach循环:
普通试用版本(推荐):
List<User> userList = new ArrayList<>();
lists.forEach(it -> userList.addAll(it));
System.out.println(userList.toString());
修改一版(推荐)这里使用了jdk 1.8新增的 :: 语法,类似于方法引用:
List<User> userList = new ArrayList<>();
lists.forEach(userList::addAll);
System.out.println(userList.toString());
调用结果:
[User(id=null, username=小黑呀0-0), User(id=null, username=小黑呀0-1), User(id=null, username=小黑呀0-2), User(id=null, username=小黑呀1-0), User(id=null, username=小黑呀1-1), User(id=null, username=小黑呀1-2), User(id=null, username=小黑呀2-0), User(id=null, username=小黑呀2-1), User(id=null, username=小黑呀2-2)]
Lambda函数(这里使用flatMap方法):
flatMap 是可以自定义方法的,当官方提供的不够用时就需要自己写逻辑
//这个就是对所有的一个降维方案:
List<User> userList = lists.stream().
flatMap(Collection::stream).
collect(Collectors.toList());
System.out.println(userList.toString());
整个对象降维的结果为
[User(id=null, username=小黑呀0-0), User(id=null, username=小黑呀0-1), User(id=null, username=小黑呀0-2), User(id=null, username=小黑呀1-0), User(id=null, username=小黑呀1-1), User(id=null, username=小黑呀1-2), User(id=null, username=小黑呀2-0), User(id=null, username=小黑呀2-1), User(id=null, username=小黑呀2-2)]
//保不齐我只需要这个user对象的一个字段,比如我只需要一个用户的名称的list
List<String> userNameList = lists.stream().
flatMap(it -> it.stream().map(User::getUsername)).
collect(Collectors.toList());
System.out.println(userNameList.toString());
降维但只获取某个字段的结果
[小黑呀0-0, 小黑呀0-1, 小黑呀0-2, 小黑呀1-0, 小黑呀1-1, 小黑呀1-2, 小黑呀2-0, 小黑呀2-1, 小黑呀2-2]
拓展:
如果需要返回结果去重请使用: Collectors.toSet()
循环输出也可以采用forEach: lists.forEach(System.out::println)
Kotlin
Spring boot Kotlin测试类
@SpringBootTest
class WebApplicationTests {
private val logger: Logger = LoggerFactory.getLogger(this::class.java)
@Test
fun t() {
val lists: MutableList<List<User>> = ArrayList()
for (i in 0..2) {
val list: MutableList<User> = ArrayList()
for (j in 0..3) {
val user = User()
user.username= "小黑呀${i}-${j}"
list.add(user)
}
lists.add(list)
}
//下面的代码同样是在这个部位移植出去的,粘贴回即可
}
}
调用方法前的参数展示:
[[User(id=null, username=小黑呀0-0), User(id=null, username=小黑呀0-1), User(id=null, username=小黑呀0-2)], [User(id=null, username=小黑呀1-0), User(id=null, username=小黑呀1-1), User(id=null, username=小黑呀1-2)], [User(id=null, username=小黑呀2-0), User(id=null, username=小黑呀2-1), User(id=null, username=小黑呀2-2)]]
kotlin 降维在他提供的函数中有两个满足要求,
1.flatten 这个方法不需要自己去写什么代码,直接调用该方法即可
2.flatMap 这个方法就需要自己写,但是需要针对返回某个字段的需求
使用flatten
val userList = lists.flatten()
println(userList.toString())
调用结果
[User(id=null, username=小黑呀0-0), User(id=null, username=小黑呀0-1), User(id=null, username=小黑呀0-2), User(id=null, username=小黑呀1-0), User(id=null, username=小黑呀1-1), User(id=null, username=小黑呀1-2), User(id=null, username=小黑呀2-0), User(id=null, username=小黑呀2-1), User(id=null, username=小黑呀2-2)]
使用flatMap(这个方法一般用于返回类中的字段)
val idList = lists.flatMap {it -> it.map { o -> o.username} }
println(idList.toString())
调用结果
[小黑呀0-0, 小黑呀0-1, 小黑呀0-2, 小黑呀1-0, 小黑呀1-1, 小黑呀1-2, 小黑呀2-0, 小黑呀2-1, 小黑呀2-2]
作者|御剑指长天|CSDN
猜你喜欢
- 2024-10-12 Excel查找重复次数最多的项目 excell查找重复数据
- 2024-10-12 经典动态规划题——打家劫舍 打家劫舍猜一肖
- 2024-10-12 函数公式的左膀右臂:ROW、COLUMN函数知多少
- 2024-10-12 C|二维数组做函数参数求矩阵乘积 c二维数组作为函数参数
- 2024-10-12 sum() 函数性能堪忧,列表降维有何良方?
- 2024-10-12 【译】Vue 何以对 React“降维打击”?
- 2024-10-12 奇异值分解与主成分分析,一文带你理解Spark分布式降维方法
- 2024-10-12 收下这波 JS 技巧,从此少加班 js怎么做加法
- 2024-10-12 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法
- 2024-10-12 盘ES6、ES7、ES8、ES9、ES10 es6解构赋值
你 发表评论:
欢迎- 最近发表
-
- 在 Spring Boot 项目中使用 activiti
- 开箱即用-activiti流程引擎(active 流程引擎)
- 在springBoot项目中整合使用activiti
- activiti中的网关是干什么的?(activiti包含网关)
- SpringBoot集成工作流Activiti(完整源码和配套文档)
- Activiti工作流介绍及使用(activiti工作流会签)
- SpringBoot集成工作流Activiti(实际项目演示)
- activiti工作流引擎(activiti工作流引擎怎么用)
- 工作流Activiti初体验及在数据库中生成的表
- Activiti工作流浅析(activiti6.0工作流引擎深度解析)
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)