2020年Java集合課堂筆記

Java集合

1.集合概述

集合:集合是java中提供的一種容器,可以用來存儲多個數據。

集合與數組的區別:

  • 數組長度固定,集合長度可變
  • 數組只能存儲類型相同的元素,集合存儲對象,對象類型可以不同

集合框架

在這裏插入圖片描述

2.Collection接口

Collection是所有單列集合的根接口,方法可用於操作所有單列集合

Collection接口的主要方法

方法聲明 功能描述
boolean add(Object o) 向集合中添加一個元素
boolean addAll(Collection c) 將集合c中的所有元素添加到該集合中
void clear() 刪除該集合的所有元素
boolean remove(Object o) 刪除該集合中的o
boolean removeAll(Collection c) 刪除該集合中包含集合c中的所有集合
boolean isEmpty() 判斷該集合是否爲空
boolean contains(Object o) 判斷該集合中是否包含元素o
boolean containsAll(Collection c) 判斷該集合是否包含集合c的所有元素
int size() 判斷該集合元素的個數
Iterator iterator() 用於遍歷該集合的所有元素
Stream stream() 將集合源轉換爲有序元素的流對象

3.List接口

List接口簡介

List集合:實現了List接口的對象

List集合特點

  • 允許出現重複的元素
  • 元素有序

List集合的常用方法

方法聲明 功能描述
void add(int d,Object e) 在該集合位置d插入元素e
boolean addAll(int i,Collection c) 將集合c中的所有元素插入該集合位置i
Object get(int d) 返回該集合位置d的元素
Object remove(int d) 刪除該集合位置d的元素
Object set(int d,Object e) 將該集合位置d的元素替換成e,並返回替換值
int indexOf(Object e) 返回元素e在集合中第一次出現的位置索引
int lastIndexOf(Object e) 返回元素e在集合中最後一次出現的位置索引
List subList(int f,int t) 返回該集合中位置f~t之間所有元素組成的子集合
Object[] toArray() 將集合元素轉換爲數組

ArrayList集合

架構:數組

作用:適用於遍歷查找元素

缺點:不適合對集合元素做大量增刪操作

實例代碼

import java.util.ArrayList;

public class Example{
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add("23");
        arrayList.add("23");
        arrayList.add("23");
        arrayList.add("23");
        arrayList.set(3, "1");
        System.out.println(arrayList.size());  //4
        System.out.println(arrayList.get(3));  //1
    }
}

LinkedList集合

架構:雙向循環鏈表

作用:更高效的增加和刪除集合中的元素

LinkedList特有方法

方法聲明 功能描述
void add(int d,E e) 在該集合位置d插入元素e
void addFirst(object o) 在該集合開頭插入元素o
void addLast(object o) 在該集合結尾插入元素o
Object removeFirst() 刪除該集合開頭的元素,並返回該元素
Object removeLast() 刪除該集合結尾的元素,並返回該元素
boolean offerFirst(Object o) 在該集合開頭插入元素o
boolean offer(Object o) 在該集合結尾插入元素o
boolean offerLast(Object o) 在該集合結尾插入元素o
Object peek() 獲取該集合開頭的元素
Object peekLast() 獲取該集合結尾的元素
Object poll() 刪除並返回該集合的開頭元素
Object pollLast() 刪除並返回該集合的結尾元素
void push(Object o) 在該集合開頭插入元素o
Object pop() 刪除並返回該集合的開頭元素

實例代碼

import java.util.LinkedList;

public class Example{
    public static void main(String[] args) {
        LinkedList link = new LinkedList();
        //1.添加元素
        link.add("stu1");
        link.add("stu2");
        System.out.println(link);  //[stu1, stu2]
        link.offer("offer");//在集合結尾添加
        link.push("push");//在集合開頭添加
        System.out.println(link);  //[push, stu1, stu2, offer]
        //2.獲取元素
        Object peek = link.peek();
        System.out.println(peek); //push
        //3.刪除元素
        link.removeFirst();
        link.pollLast();
        System.out.println(link); //[stu1, stu2]
    }
}

4.3種Collection集合遍歷

Iterator遍歷集合

Iterator接口 ,Iterator對象被稱爲迭代器

作用:遍歷Collection中的元素

遍歷集合過程

  1. 調用集合對象的iterator()方法獲得迭代器對象

  2. 使用迭代器對象的hashNext()方法判斷集合是否存在下一個元素

  3. 判斷結果爲true,則調用next()方法取出元素,

    判斷結果爲false,則遍歷結束

實例代碼

import java.util.ArrayList;
import java.util.Iterator;

public class Example{
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("data1");
        list.add("data2");
        list.add("data3");
        list.add("data4");
        Iterator iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.println( iterator.next());
        }
    }
}

forEach遍歷集合

foreach循環是一種更加簡潔的for循環,也叫加強for循環

for(容器中元素類型 臨時變量 : 容器變量){
    //執行語句
}

注意:foreach循環過程中,不能對元素的值進行修改

實例代碼

public class Example{
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("data1");
        list.add("data2");
        list.add("data3");
        list.add("data4");
        for (Object o : list) {
            System.out.println(o);
        }
    }
}

JDK8的forEach遍歷集合

forEach(Consumer action)方法,方法的參數是一個函數式接口。

實例代碼

import java.util.ArrayList;

public class Example{
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("data1");
        list.add("data2");
        list.add("data3");
        list.add("data4");
        list.forEach(obj-> System.out.println("迭代集合元素:"+obj));
    }
}

5.Set接口

Set接口簡介

set集合特點

  • 不允許存在重複元素
  • 元素無序

HashSet集合

Set接口的一個實現類,特點和Set接口一樣

實例代碼

import java.util.Iterator;

public class Example{
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        hashSet.add("stu1");
        hashSet.add("stu2");
        hashSet.add("stu2");
        hashSet.add("stu3");
        System.out.println(hashSet);
        Iterator iterator = hashSet.iterator();
        while(iterator.hasNext()){
            System.out.println("第一種遍歷方式:"+iterator.next());
        }
        for (Object i : hashSet) {
            System.out.println("第二種遍歷方式:"+i);
        }
        hashSet.forEach(o-> System.out.println("第三種遍歷方式:"+o));
    }
}

TreeSet集合

架構:平衡二叉樹

TreeSet集合的特有方法

方法聲明 功能描述
Object first() 返回該集合的開頭元素
Object last() 返回該集合的結尾元素
Object lower(Object o) 返回該集合中小於o的最大元素,沒有返回null
Object floor(Object o) 返回該集合中小於或等於o的最大元素,沒有返回null
Object higher(Object o) 返回該集合中大於o的最小元素,沒有返回null
Object ceiling(Object o) 返回該集合中大於或等於o的最小元素,沒有返回null
Object pollFirst() 刪除並返回該集合的開頭元素
Object pollLast() 刪除並返回該集合的結尾元素

實例代碼

import java.util.TreeSet;

public class Example{
    public static void main(String[] args) {
       //創建TreeSet集合
        TreeSet ts = new TreeSet();
        ts.add(2);
        ts.add(31);
        ts.add(9);
        ts.add(18);
        ts.add(9);
        System.out.println("創建的TreeSet集合:"+ts);
        //獲取首尾元素
        System.out.println("TreeSet首元素:"+ts.first());
        System.out.println("TreeSet結尾元素:"+ts.last());
        //比較並獲取元素
        System.out.println("集合中小於或等於10的最大的一個元素"+ts.floor(10));
        System.out.println("集合中大於10的最小的一個元素"+ts.higher(10));
        System.out.println("集合中大於100的最小的一個元素"+ts.higher(100));
        //刪除元素
        Object o = ts.pollFirst();
        System.out.println("刪除元素:"+o);
        System.out.println("刪除元素後的集合:"+ts);
    }
}

TreeSet的排序規則

  1. 自然排序
  • TreeSet集合中存儲的元素所在類必須實現Comparable接口,並重寫compareTo()方法
  • TreeSet集合會對該類型元素使用compareTo()方法進行比較,默認升序排序

實例代碼


import java.util.TreeSet;

class Student implements Comparable{
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name+":"+age;
    }

    @Override
    public int compareTo(Object obj) {
        Student student = (Student) obj;
        if(this.age-student.age>0){
           return 1;
        }else if(this.age-student.age==0){
            return this.name.compareTo(student.name);
        }
        return -1;
    }
}
public class Example{
    public static void main(String[] args) {
       //創建TreeSet集合
        TreeSet ts = new TreeSet();
        ts.add(new Student("阿凡",19));
        ts.add(new Student("阿凡",23));
        ts.add(new Student("阿凡",6));
        ts.add(new Student("阿凡",23));

        System.out.println(ts); //[阿凡:6, 阿凡:19, 阿凡:23]

    }
}
  1. 定製排序

作用:自定義一個比較器

實例代碼

import java.util.Comparator;
import java.util.TreeSet;
//根據首字母大小寫排序
class MyComparator implements Comparator{
    @Override
    public int compare(Object o1, Object o2) {
        String name1 = (String) o1;
        String name2 = (String) o2;
        StringBuffer sb1 = new StringBuffer(name1);
        StringBuffer sb2 = new StringBuffer(name2);
        int temp = (int)sb1.charAt(0) - (int)sb2.charAt(0);
        return temp; //由低到高排序

    }
}
public class Example{
    public static void main(String[] args) {
       //創建TreeSet集合
        TreeSet ts = new TreeSet(new MyComparator());
        ts.add("Jack");
        ts.add("Tom");
        ts.add("Nancy");
        ts.add("Afan");
        System.out.println(ts); //[Afan, Jack, Nancy, Tom]
    }
}

6.Map接口

Map接口簡介

Map接口是一種雙列集合,它的每個元素都包含一個鍵對象Key和值對象Value,鍵和值對象之間存在一種對應關係,稱爲映射。Map的映射關係是一對一的。

特點:

  • Key與Value可以是任意數據類型
  • 鍵對象Key不可以重複

Map集合常用方法

方法聲明 功能描述
void put(Object k,Object v) 往集合中添加鍵值對
int size() 返回鍵值對的個數
Object get(Object k) 根據鍵k得到值,沒有則返回null
boolean containsKey(Object k) 判斷集合是否存在鍵k
boolean containValue(Object v) 判斷集合是否存在值v
Object remove(Object k) 刪除並返回鍵k對應的鍵值對
void clear() 清空Map集合
Set keySet() 將鍵轉化爲Set集合
Collection values() 將值轉化爲Collection集合
Set<Map.Entry<K,V>>entrySet() 將Map集合轉化爲存儲類型爲Map的Set集合
Object getOrDefault(Object k,Object dv) 返回鍵k對應的值,沒有則返回dv
Object putIfAbsent(Object k,Object v) 添加鍵值對,重複則返回返回已存在值v
boolean remove(Object k,Object v) 刪除
boolean replace(Object k,Object v) 將制定鍵k對應的值修改爲值v

HashMap集合

架構:數組+鏈表

HashMap集合特點

  • 鍵和值允許爲空,但鍵不能重複
  • 集合中的元素是無序的

實例代碼

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Example{
    public static void main(String[] args) {
        Map map = new HashMap();
        //向Map存儲鍵值對
        map.put(1,"Tom");
        map.put(2,"Afan");
        map.put(3,"Nancy");
        map.put(4,"Li");
        map.put(1,"Jack");
        System.out.println(map);
        //查看鍵對象是否存在
        System.out.println(map.containsKey(5));
        //將鍵轉化爲Set集合
        Set set = map.keySet();
        System.out.println(set);
        //獲取指定鍵對象映射的值
        Object o = map.get(2);
        System.out.println(o);
        //替換指定鍵對應的值
        map.replace(3,"阿凡");
        System.out.println(map);
        //刪除指定鍵映射的鍵值對元素
        map.remove(1);
        System.out.println(map);
    }
}

Map集合遍歷

  1. Iterator迭代器遍歷Map集合

    過程:

    1. 將Map集合轉化爲Iterator接口對象
    2. 兩種方式遍歷集合(KeySet()方法和entrySet()方法)

    實例代碼1

    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    public class Example{
        public static void main(String[] args) {
            Map map = new HashMap();
            //向Map存儲鍵值對
            map.put(1,"Tom");
            map.put(2,"Afan");
            map.put(3,"Nancy");
            map.put(4,"Li");
            map.put(5,"Jack");
            //keySet()方法
            Iterator iterator = map.keySet().iterator();
            while(iterator.hasNext()){
                Object key = iterator.next();
                Object value = map.get(key);
                System.out.println(key+":"+value);
            }
        }
    }
    

    實例代碼2

    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    public class Example{
        public static void main(String[] args) {
            Map map = new HashMap();
            //向Map存儲鍵值對
            map.put(1,"Tom");
            map.put(2,"Afan");
            map.put(3,"Nancy");
            map.put(4,"Li");
            map.put(5,"Jack");
            //entrySet()方法
            Set set = map.entrySet();
            Iterator iterator = set.iterator();
            while(iterator.hasNext()){
                Map.Entry next = (Map.Entry) iterator.next();
                Object key = next.getKey();
                Object value = next.getValue();
                System.out.println(key+":"+value);
            }
        }
    }
    

注意:Entry是Map接口的內部類

  1. 使用forEach()方法遍歷集合

    實例代碼

    import java.util.HashMap;
    import java.util.Map;
    public class Example{
        public static void main(String[] args) {
            Map map = new HashMap();
            //向Map存儲鍵值對
            map.put(1,"Tom");
            map.put(2,"Afan");
            map.put(3,"Nancy");
            map.put(4,"Li");
            map.put(5,"Jack");
    
            map.forEach((key,value)-> System.out.println(key+":"+value));
        }
    }
    

LinkedHashMap集合

LinkedHashMap類是HashMap的子類,內部是雙向鏈表

作用:保證元素取出順序與存入順序一致

實例代碼

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class Example{
    public static void main(String[] args) {
        Map map = new HashMap();
        //向Map存儲鍵值對
        map.put(4,"Tom");
        map.put(3,"Afan");
        map.put(2,"Nancy");
        map.put(1,"Li");
        System.out.println(map);
        System.out.println("-------兩者比較---------");
        LinkedHashMap map2 = new LinkedHashMap();
        map2.put(4,"Tom");
        map2.put(3,"Afan");
        map2.put(2,"Nancy");
        map2.put(1,"Li");
        System.out.println(map2);
    }
}

TreeMap集合

架構:二叉樹,用法參考TreeSet集合

實例代碼

import java.util.*;

class MyComparator implements Comparator{

    @Override
    public int compare(Object o1, Object o2) {
        String key1 = (String)o1;
        String key2 = (String)o2;
        return key1.compareTo(key2);
    }
}
public class Example{
    public static void main(String[] args) {
        Map map = new TreeMap(new MyComparator());
        map.put("2","Li");
        map.put("1","Afan");
        map.put("3","Tom"); //兩個參數必須是String類型,否則異常
        System.out.println(map);
    }
}

Properties集合

Properties類是Hashtable類的子類

實例代碼

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;

public class Example{
    public static void main(String[] args) throws Exception {
        //1.通過Properties進行屬性文件讀取操作
        Properties pps = new Properties();
        //加載要讀取的文件
        pps.load(new FileInputStream("test.properties"));
        //遍歷test.Properties鍵值對信息
        pps.forEach((key,value)-> System.out.println(key+"="+value));
        //2.通過Properties進行屬性文件讀取操作
        //指定要寫入操作的文件名稱和位置
        FileOutputStream out = new FileOutputStream("test.properties");
        //向properties文件進行寫入鍵值對信息
        pps.setProperty("charset","UTF-8");
        //將此新添鍵值對寫入配置文件
        pps.store(out,"新增charset編碼");
    }
}

7.泛型

作用:防止程序運行時出現類型轉換異常

具體格式:

ArrayList<參數化類型> list = new ArrayList<參數化類型>();

8.常用工具類

Collection工具類

作用:集合工具類,提供了大量靜態方法用於對集合中元素進行排序、查找和修改

  1. 添加、排序操作
方法聲明 功能描述
staticboolean addAll(Collection<?super T>c,T…e) 將所有指定元素添加到指定集合c中
static void reverse(List list) 反轉指定List集合中元素的順序
static void shuffle(List list) 對List集合中的元素隨機排序
static void sort(List list) 對List集合中的元素自然排序
static void swap(List list,int i,int j) 將指定List集合第i和j處的元素交換

實例代碼

import java.util.ArrayList;
import java.util.Collections;

public class Example{
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"c","z","a","w");
        System.out.println("排序前:"+list);
        Collections.reverse(list);
        System.out.println("反轉後:"+list);
        Collections.sort(list);
        System.out.println("自然排序後:"+list);
        Collections.shuffle(list);
        System.out.println("隨機打亂後:"+list);
        Collections.swap(list,0,list.size()-1);
        System.out.println("首尾元素位置交換:"+list);
    }
}
  1. 查找、替換操作
方法聲明 功能描述
static int binarySearch(List,Object k) 二分法搜索指定對象在List集合中的索引(查找的元素必須是有序的)
static Object max(Collection col) 根據元素的自然順序,返回給定集合中最大的元素
static Object min(Collection col) 根據元素的自然順序,返回給定集合中最小的元素
static boolean replaceAll(List list,Object o,Object n) 用n替換集合list裏所有的o

實例代碼

import java.util.ArrayList;
import java.util.Collections;

public class Example{
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list,9,0,4,2,1,0,6);
        System.out.println("集合中的元素:"+list);
        System.out.println("集合中最大元素"+ Collections.max(list));
        System.out.println("集合中最小元素"+ Collections.min(list));
        Collections.replaceAll(list,8,0);
        System.out.println("替換後的集合:"+list);
        Collections.sort(list);
        int index = Collections.binarySearch(list, 2);
        System.out.println("集合通過二分查找法查找元素2的索引:"+index);

    }
}

Arrays工具類

作用:數組工具類,提供了大量針對數組操作的靜態方法。

  1. 使用sort()方法排序

    實例代碼

    import java.util.Arrays;
    
    public class Example{
        public static void main(String[] args) {
           int[] arr = {2,5,2,4,1,6,8};
            System.out.println("排序前:");
            printArray(arr);
            Arrays.sort(arr);
            System.out.println("排序後:");
            printArray(arr);
        }
        public static void printArray(int[] arr){
            for (int i : arr) {
                System.out.print(i+" ");
            }
            System.out.println();
        }
    }
    
  2. 使用binarySearch(Object[] a,Object key)方法查找元素

    實例代碼

    import java.util.Arrays;
    
    public class Example{
        public static void main(String[] args) {
          int[] arr = {9,3,8,2,1};
          Arrays.sort(arr);
          int index = Arrays.binarySearch(arr, 1);
          System.out.println("元素1的索引:"+index);
        }
    }
    

    注意:二分法前提是這是有序數組

  3. copyOfRange(int[] original,int from,int to)方法拷貝元素

    實例代碼

    import java.util.Arrays;
    
    public class Example{
        public static void main(String[] args) {
            int[] arr = {9,3,8,2,1};
            int[] copied = Arrays.copyOfRange(arr,2,8);
            for (int i = 0; i < copied.length; i++) {
                System.out.print(copied[i]+" "); //8 2 1 0 0 0 
            }
        }
    }
    
  4. 使用fill(Object[] a,Object val)方法替換元素

    實例代碼

    import java.util.Arrays;
    
    public class Example{
        public static void main(String[] args) {
           int arr[] = {1,2,3,4};
           Arrays.fill(arr,8);
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i]+" "); //8 8 8 8 
            }
        }
    }
    

9.聚合操作

聚合操作簡介

​ JDK8增加了一個Stream接口,該接口可以將集合、數組中的元素轉換爲Stream流的形式,並結合Lamabda表達式的優勢來進一步簡化集合、數組中的查找、過濾、轉換等操作,這一功能稱爲聚合操作

使用聚合操作的3個步驟

  1. 將原始集合或數組對象轉換爲Stream流對象。
  2. 對Stream流對象中的元素進行一系列的過濾、查找等中間操作,然後仍返回一個Stream流對象。
  3. 對Stream流進行遍歷、統計、收集等終結操作,獲取想要的結果。

實例代碼

import java.util.ArrayList;
import java.util.stream.Stream;

public class Example{
    public static void main(String[] args) {
        //創建一個List集合對象
        ArrayList<String> list = new ArrayList<>();
        list.add("阿凡");
        list.add("張三");
        list.add("李四");
        list.add("王五");
        //創建一個Stream流對象
        Stream<String> stream = list.stream();
        //鏈式調用
        stream.filter(i->i.startsWith("張")).limit(2)
                .forEach(j-> System.out.println(j));
    }
}

創建Stream流對象的三種方式

  • 所有的Collection集合都可以使用stream()靜態方法獲取Stream流對象

  • Stream接口的of()靜態方法可以獲取基本類型包裝類數組、引用類型數組和單個元素的

    Stream流對象

  • Arrays數組工具類的stream()靜態方法可以獲取數組元素的Stream流對象

實例代碼

import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Stream;

public class Example{
    public static void main(String[] args) {
        //創建一個List集合對象
        Integer[] arr = {2,3,7,5,0,1};
        ArrayList<String> list = new ArrayList<>();
        list.add("阿凡");
        list.add("張三");
        list.add("李四");
        list.add("王五");
        //創建一個Stream流對象
        Stream<String> stream1= list.stream();
        stream1.forEach(o-> System.out.print(o+" "));
        System.out.println();
        Stream<Integer> stream2 = Stream.of(arr);
        stream2.forEach(o-> System.out.print(o+" "));
        System.out.println();
        Stream<Integer> stream3 = Arrays.stream(arr);
        stream3.forEach(o-> System.out.print(o+" "));
        System.out.println();
    }
}

Stream流的常用方法

Stream流的常用方法

方法聲明 功能描述
Stream filer(函數式接口) 將指定流對象中的元素進行過濾,並返回一個子流對象
Streammap(Function函數式接口) 將流中的元素按規則映射到另一個流中
Stream distinct() 刪除流中的重複元素
Stream sorted() 將流中的元素按自然順序排序
Stream limit(long max) 截取流中元素的長度
Stream skip(long n) 跳過流中的前n個元素
staticStream concat(Stream 1,Stream 2) 將兩個流合併爲一個流
long count() 統計流中的元素個數
R collect(Collector collector) 將流中的元素收集到一個容器中(如集合)
Object[] toArray() 將流中的元素收集到一個數組中
void forEach(Lamabda表達式) 將流中的元素進行遍歷
  1. 遍歷

實例代碼

import java.util.stream.Stream;

public class Example{
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("張三", "李四", "阿凡", "張曉明");
        stream.forEach(o-> System.out.println(o));
    }
}
  1. 過濾

實例代碼

public class Example{
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("張三", "李四", "阿凡", "張曉明");
        stream.filter(i->i.startsWith("張"))
                .filter(i->i.length()>2)
                .forEach(System.out::println);
    }
}
  1. 映射

實例代碼

import java.util.stream.Stream;

public class Example{
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("a1","a2","b1","c1","c2");
        stream.filter(s->s.startsWith("c"))
                .map((String s)->s.toUpperCase() )
                .sorted()
                .forEach(i-> System.out.println(i));

    }
}
  1. 截取

實例代碼

import java.util.stream.Stream;

public class Example{
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("張三","李四","張曉明","張陽");
        stream.skip(1)  
                .limit(2)
                .forEach(i-> System.out.println(i));
        
    }
}
  1. 收集

作用:終結操作,把Stream元素保存爲集合、字符串等。

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Example{
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("張三","李四","張曉明","張陽");
        List<String> list = stream.filter(i -> i.startsWith("張"))
                .collect(Collectors.toList());
        System.out.println("轉化爲集合:"+list);
        //轉化爲集合:[張三, 張曉明, 張陽]
        Stream<String> stream2 = Stream.of("張三","李四","張曉明","張陽");
        String str = stream2.filter(i -> i.startsWith("張"))
                .collect(Collectors.joining("and"));
        System.out.println("轉化爲字符串:"+str);
        //轉化爲字符串:張三and張曉明and張陽
    }
}

注意:一個Stream流對象可以有多次中間操作,仍返回一個流對象,

​ 一個流對象只能進行一次終結操作,且一旦進行,該流對象就不復存在。

Parallel Stream(並行流)

之前介紹的創建Stream流對象的3種方式都是串行流,即單線程下執行聚合操作的流

並行流將源數據分爲多個子流對象支持多線程操作,最後結果彙總爲一個流對象

創建並行流的兩種方式

  1. 通過Collection集合接口的parallelStream()方法直接將集合類型的源數據轉變爲Stream並行流
  2. BaseStream接口的parallel()方法將Stream串行流轉變爲Stream並行流,還有一個isParallel()方法用於判斷當前Stream流對象是否是並行流。

實例代碼

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Example{
    public static void main(String[] args) {
        List<String> list = Arrays.asList("張三", "李四", "張曉明", "張陽");
        Stream<String> parallelStream = list.parallelStream();
        System.out.println(parallelStream.isParallel());  //true
        Stream<String> stream = Stream.of("張三", "李四", "張曉明", "張陽");
        Stream<String> parallel = stream.parallel();
        System.out.println(parallel.isParallel());  //true

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章