博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的集合转换(lambda表达式)
阅读量:3977 次
发布时间:2019-05-24

本文共 3589 字,大约阅读时间需要 11 分钟。

        在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循环一个个比吧!

@Data   //lombok提供的注解,会自动添加getter和setterpublic class Student {   private String id;   private String name;   private String info;}

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

Map
studentMap = list.stream().collect(Collectors.toMap(Student::getId, Function.identity()));if(studentMap.containsKey(studentNew.getId())) { System.out.println("studentNew in map!");}

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

List
listValues = new ArrayList
(studentMap.values()); //map valuesList
listKeys = new ArrayList
(studentMap.keySet()); //map keys

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

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

Set
set = new HashSet
();set.add("123");set.add("456");List
setToList = new ArrayList
(set); //Set To List

List To Set:

Set
listToSet = new HashSet
(listSet);

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

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

参考:

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

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

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

Set
mapToSetKeys = new HashSet
(studentMap.keySet()); //map keysSet
mapToSetValues = new HashSet
(studentMap.values()); //map values

Set To Map:

Map
setToMap = mapToSetValues.stream().collect(Collectors.toMap(Student::getId, Function.identity()));

5.List排序

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

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

6.stream中的filter功能

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

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

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

filter会对List中的每个元素进行处理。

7.stream中的map功能

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

List
mapResult = list.stream().map(p -> { p.setName(p.getName() + " China"); return p;}).collect(Collectors.toList());mapResult.stream().forEach(p -> { System.out.println(p.getName());});

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

List
mapResult = list.stream().map(p -> {p.setName(p.getName() + " China"); return p.getName();}).collect(Collectors.toList());mapResult.stream().forEach(p -> { System.out.println(p);});

8.filter和map结合起来用

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

List
result = list.stream().filter(p -> StringUtils.equals("Jack", p.getName())).map(p -> { p.setName(p.getName() + " China"); return p;}).collect(Collectors.toList()); result.stream().forEach(p -> { System.out.println(p.getName());});

文章作者:Tyan

博客:

转载地址:http://izwui.baihongyu.com/

你可能感兴趣的文章
Android详细解释键盘和鼠标事件
查看>>
如何成为强大的程序员?
查看>>
打包时sun.misc.ServiceConfigurationError
查看>>
摘自 管理自己[Managing Oneself]
查看>>
程序员开发大型应用程序的技巧
查看>>
远程团队管理的10条戒律
查看>>
在服务器上排除问题的头五分钟
查看>>
Diagnosing DFC Configuration Problems
查看>>
jboss java.lang.NoClassDefFoundError: Could not initialize class com.documentum.fc.client.DfClient
查看>>
芯片常见封装
查看>>
什么是oc门
查看>>
上拉电阻&nbsp;下拉电阻的汇总
查看>>
NTC热敏电阻的基本特性
查看>>
数字地和模拟地处理的基本原则
查看>>
集电极开路,漏极开路,推挽,上拉电…
查看>>
长尾式差分放大电路2
查看>>
十种精密整流电路
查看>>
红外线遥控原理
查看>>
放大电路的主要性能指标?
查看>>
稳压、调压、监控、DC/DC电路大全
查看>>