1. 程式人生 > >使用lambda表示式對集合進行轉換

使用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().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());
});