Java中的集合轉換(lambda表達式)

文章作者: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());
});
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • Scala的集合類可以從三個維度進行切分: 可變與不可變集合(Immutable and mutable coll...
    時待吾閱讀 5,862評論 0 4
  • 首頁 資訊 文章 資源 小組 相親 登錄 注冊 首頁 最新文章 IT 職場 前端 后端 移動端 數據庫 運維 其他...
    Helen_Cat閱讀 3,931評論 1 10
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,777評論 0 33
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399