文章作者:Tyan
博客:noahsnail.com
在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<Student> list
和一個要新添加的學生Student studentNew
,在添加學生之前需要對新添加的學生信息studentNew
進行判斷是否已經在list
中,學生的唯一標識是id,不考慮其他,就是單純的用Java代碼判斷,此時就需要將List轉為Map,代碼如下:
Map<String, Student> studentMap = list.stream().collect(Collectors.toMap(Student::getId, Function.identity()));
if(studentMap.containsKey(studentNew.getId())) {
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
Set To Map:
Map<String, Student> 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<Student> 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<Student> 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<String> 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<Student> 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());
});