在Java应用中进行集合对象间的转换是非常常见的事情,有时候在处理某些任务时选择一种好的数据结构往往会起到事半功倍的作用,因此熟悉每种数据结构并知道其特点对于程序员来说是非常重要的,而只知道这些是不够的,有时候你需要一个Map来处理数据,而此时你手中只有一个List,此时知道如何将List转为Map就非常重要了,而只知道for循环将List转为Map这就太Low了,JDK1.8 吸收了许多函数式编程的思想,其中的lambda表达式不仅功能强大,而且减少了很多不必要的代码,本文不是介绍lambda表达式的,主要是利用lambda表达式进行Java中结合的转换,当然lambda表达式的使用往往离不开JDK1.8 的stream类,本文主要使用lambda表达式和stream类来实现Java中集合的转换,也会涉及到利用stream对数据进行的一些处理。

1.List To Map <==> Map To List

将List转换为Map是Java中的常见操作,例如我想知道某个对象是否已经在List中,此时就需要将List转成Map,你总不会打算for循环一个个比吧!

  1.  
    @Data //lombok提供的注解,会自动添加getter和setter
  2.  
    public class Student {
  3.  
    private String id;
  4.  
    private String name;
  5.  
    private String info;
  6.  
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

现在有一个所有学生信息的列表List<Student> list和一个要新添加的学生Student studentNew,在添加学生之前需要对新添加的学生信息studentNew进行判断是否已经在list中,学生的唯一标识是id,不考虑其他,就是单纯的用Java代码判断,此时就需要将List转为Map,代码如下:

  1.  
    Map<String, Student> studentMap = list.stream().collect(Collectors.toMap(Student::getId, Function.identity()));
  2.  
    if(studentMap.containsKey(studentNew.getId())) {
  3.  
    System.out.println("studentNew in map!");
  4.  
    }
  • 1
  • 2
  • 3
  • 4

将Map转为List就非常简单了:

  1.  
    List<Student> listValues = new ArrayList<Student>(studentMap.values()); //map values
  2.  
    List<String> listKeys = new ArrayList<String>(studentMap.keySet()); //map keys
  • 1
  • 2

2.List To Set <==> Set To List

List与Set之间的转换就很容易了,Set To List:

  1.  
    Set<String> set = new HashSet<String>();
  2.  
    set.add("123");
  3.  
    set.add("456");
  4.  
    List<String> setToList = new ArrayList<String>(set); //Set To List
  • 1
  • 2
  • 3
  • 4

List To Set:

Set<String> listToSet = new HashSet<String>(listSet);
  • 1

注:如果需要对List去重可以使用Set,这List To Set + Set To List两个操作可以将List中的重复元素去掉。这里用的是HashSet,如果需要一个有序的List,可以选择TreeSet,TreeSet需要实现对象的Comparable接口。

3.Array To List <==> List To Array

参考:Java中List与Array的转换 
注:对Array的许多操作都可以先将Array转为List,然后再进行需要的转换再进行处理,或转为List后使用Stream提供的操作来进行处理。

4.Map To Set <==> Set To Map

Map与Set之间的转换也比较简单,Map To Set:

  1.  
    Set<String> mapToSetKeys = new HashSet<String>(studentMap.keySet()); //map keys
  2.  
    Set<Student> mapToSetValues = new HashSet<Student>(studentMap.values()); //map values
  • 1
  • 2

Set To Map:

Map<String, Student> setToMap = mapToSetValues.stream().collect(Collectors.toMap(Student::getId, Function.identity()));
  • 1

5.List排序

要对List中的对象进行排序以前非常麻烦,什么对象实现Comparable接口啊,写一个StudentComparator实现Comparator接口呀,非常麻烦,现在非常简单一行代码搞定(两种方式):

  1.  
    list.sort(Comparator.comparing(Student::getName)); //按名字排序
  2.  
    list.sort((p1,p2) -> {
  3.  
    return p1.getName().toLowerCase().compareTo(p2.getName().toLowerCase());
  4.  
    });//lambda表达式
  5.  
     
  • 1
  • 2
  • 3
  • 4
  • 5

6.stream中的filter功能

filter功能主要是对集合中的元素进行过滤,以List为例,找出名字叫Jack的学生:

  1.  
    List<Student> filterResult = list.stream().filter(p -> StringUtils.equals(p.getName(), "Jack")).collect(Collectors.toList());
  2.  
    filterResult.stream().forEach(p -> {
  3.  
    System.out.println(p.getName());
  4.  
    });
  • 1
  • 2
  • 3
  • 4

上面的代码使用了stream的filter函数和forEach函数,以后可以少写for循环遍历List了。filter的->后面需要返回一个boolean值。最好”Jack”写前面,习惯。 
filter会对List中的每个元素进行处理。

7.stream中的map功能

给每个学生的名字后面加上个China:

  1.  
    List<Student> mapResult = list.stream().map(p -> {
  2.  
    p.setName(p.getName() + " China");
  3.  
    return p;
  4.  
    }).collect(Collectors.toList());
  5.  
    mapResult.stream().forEach(p -> {
  6.  
    System.out.println(p.getName());
  7.  
    });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

map函数的主要功能是对List中的每个元素进行处理并返回,可以返回其它的数据类型,例如:

  1.  
    List<String> mapResult = list.stream().map(p -> {
  2.  
    p.setName(p.getName() + " China");
  3.  
    return p.getName();
  4.  
    }).collect(Collectors.toList());
  5.  
    mapResult.stream().forEach(p -> {
  6.  
    System.out.println(p);
  7.  
    });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

8.filter和map结合起来用

找出名字为Jack的Student并在名字后面加上China:

  1.  
    List<Student> result = list.stream().filter(p -> StringUtils.equals("Jack", p.getName())).map(p -> {
  2.  
    p.setName(p.getName() + " China");
  3.  
    return p;
  4.  
    }).collect(Collectors.toList());
  5.  
    result.stream().forEach(p -> {
  6.  
    System.out.println(p.getName());
  7.  
    });
 

最新文章

  1. 小谈一下JavaScript中的JSON
  2. springMVC:通配符的匹配很全面, 但无法找到元素 &#39;mvc:annotation-driven&#39; 的声明
  3. Hibernate大福利 下载链接
  4. S5中新增的Array方法详细说明
  5. apache 设置禁止访问某些文件或目录
  6. jquery的select元素和option的相关操作
  7. 【Alpha】第二次Daily Scrum Meeting
  8. Android 之旅开始了!先自我了解下Android与Linux之间的关系
  9. (NO.00001)iOS游戏SpeedBoy Lite成形记(二十九):增加排行榜功能2
  10. Vue中的状态管理器 - Vuex
  11. 使用jQuery+huandlebars遍历if判断不足引用helper
  12. Todolist分别用React与Vue的实现与思考
  13. CentOS 7解压安装PHP7.1.21
  14. 解决ubuntu13.04 有线网络 时常掉线的问题
  15. 考研编程练习----m叉树先序和后序所包含的情况
  16. 怎样去面试JavaScript开发者
  17. LeetCode 336. Palindrome Pairs
  18. CSS+DIV网页样式布局实战从入门到精通 中文pdf扫描版
  19. 【二分+扫描线乱搞】B. Producing Snow
  20. bzoj 2245 [SDOI2011]工作安排【最小费用最大流】

热门文章

  1. 鸟哥的linux私房菜——第七章学习(Linux 磁盘与文件系统管理)
  2. anaconda jupyter notebook 启动方法
  3. P1337 [JSOI2004]平衡点(模拟退火)题解
  4. mysql(五)--性能优化总结
  5. Set DSL in Ubuntu 18.04
  6. js load more select
  7. JavaScript this All In One
  8. js 金融数字格式化
  9. GitHub for VSCode
  10. UI Design &amp; App &amp; Free Icons