Java和Kotlin 的降维方法

更新时间:2020-09-01 15:38:00 点击次数:1472次
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]

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

回到顶部
嘿,我来帮您!