使⽤lambda表达式对集合进⾏转换
序⾔
在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和setter
public class Student {
private String id;
private String name;
private String info;
}
现在有⼀个所有学⽣信息的列表List list和⼀个要新添加的学⽣Student studentNew,在添加学⽣之前需要对新添加的学⽣信息studentNew进⾏判断是否已经在list中,学⽣的唯⼀标识是id,不考虑其他,就是单纯的⽤Java代码判断,此时就需要将List转为Map,代码如下:
Map<String, Student> studentMap = list.stream().Map(Student::getId, Function.identity()));
Id())) {
System.out.println("studentNew in map!");
}
将Map转为List就⾮常简单了:
List<Student> listValues = new ArrayList<Student>(studentMap.values()); //map values
List<String> listKeys = new ArrayList<String>(studentMap.keySet()); //map keys
2.List To Set <==> Set To List
List与Set之间的转换就很容易了
Set To List:
Set<String> set = new HashSet<String>();
set.add("123");
set.add("456");
List<String> setToList = new ArrayList<String>(set); //Set To List
List To Set:
Set<String> listToSet = new HashSet<String>(listSet);
注:如果需要对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:
Set<String> mapToSetKeys = new HashSet<String>(studentMap.keySet()); //map keys
Set<Student> mapToSetValues = new HashSet<Student>(studentMap.values()); //map values
java streamSet To Map:
Map<String, Student> setToMap = mapToSetValues.stream().Map(Student::getId, Function.identity()));
5.List排序
要对List中的对象进⾏排序以前⾮常⿇烦,什么对象实现Comparable接⼝啊,写⼀个StudentComparator实现Comparator接⼝呀,⾮常⿇烦,现在⾮常简单⼀⾏代码搞定(两种⽅式):
list.sort(Comparatorparing(Student::getName)); //按名字排序
list.sort((p1,p2) -> {
Name().toLowerCase()Name().toLowerCase());
});//lambda表达式
6.stream中的filter功能
filter功能主要是对集合中的元素进⾏过滤,以List为例,出名字叫Jack的学⽣:
List<Student> filterResult = list.stream().filter(p -> StringUtils.Name(), "Jack")).List());
filterResult.stream().forEach(p -> {
System.out.Name());
});
上⾯的代码使⽤了stream的filter函数和forEach函数,以后可以少写for循环遍历List了。filter的->后⾯需要返回⼀个boolean值。最好”Jack”写前⾯,习惯。
filter会对List中的每个元素进⾏处理。
7.stream中的map功能
给每个学⽣的名字后⾯加上个China:
List<Student> mapResult = list.stream().map(p -> {
p.Name() + " China");
return p;
}).List());
mapResult.stream().forEach(p -> {
System.out.Name());
});
map函数的主要功能是对List中的每个元素进⾏处理并返回,可以返回其它的数据类型,例如:
List<String> mapResult = list.stream().map(p -> {
p.Name() + " China");
Name();
}).List());
mapResult.stream().forEach(p -> {
System.out.println(p);
});
8.filter和map结合起来⽤
出名字为Jack的Student并在名字后⾯加上China:
List<Student> result = list.stream().filter(p -> StringUtils.equals("Jack", p.getName())).map(p -> {  p.Name() + " China");
return p;
}).List());
result.stream().forEach(p -> {
System.out.Name());
});

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。