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]
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。