计算机系统应用教程网站

网站首页 > 技术文章 正文

Java和Kotlin 的降维方法 kotlin jvm

btikc 2024-10-12 10:49:34 技术文章 4 ℃ 0 评论

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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表