Java集合

Java集合

  • 为了保存这些数目不确定的对象,Java中提供了一系列特殊的类,统称为集合,集合可以存贮任意类型的对象,并且长度可变。
  • 集合类都位于java.util 包中,在使用时一定要注意导包的问题
  • Collection:单列集合的根接口,用于储存一系列符合某种规则的元素
    • Collection集合有两个重要的子接口,分别是List和Set
    • List集合的特点是元素有序,可重复
    • Set集合的特点是元素无序并且不可重复
    • List接口的主要实现类有Arraylist和LinkedList
    • Set接口的主要实现类有HashSet和TreeSet
  • Map:双列口集合的根接口,用于储存具有键(Key),值(Value)映射关系的元素
    • Map集合中的每个元素都包含一堆键值,并且Key是唯一的,在使用Map集合是可以通过指定的Key找到对应的Value
    • Map接口的主要实现类有HashMap和TreeMap

List接口

  • List接口继承自Collection接口
  • List结合中允许出现重复的元素,所有的元素是一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素
  • List结合元素有序,即存入顺序和取出顺序一致

List集合常用的方法

方法声明功能描述
add()向集合添加一个元素
addAll()将集合c的所有元素插入该集合中
clear()删除该集合的所有元素
remove()删除某个元素
removeAll()删除集合中包含集合c的所有元素
isEmpty()判断集合是否为空
contains()判断集合是否包含某个元素
containsAll()判断集合是否包含某个集合c中的所有元素
size()获取集合元素的个数
get()返回集合某处的元素
set()将索引某处的元素替换,并将替换后的元素返回
indexOf()返回某元素首次出现的位置
subList()返回从[ )之间按的元素
toArray()将集合元素转换为数组

ArrayList集合

  • ArrayList内部封装了一个长度可变的数组对象(可看作一个长度可变的数组)
  • ArrayList内部的数据存储结构式数组形式,增加和删除元素的效率低,遍历和查找的效率高
package top.dty.collection;

import java.util.ArrayList;
import java.util.Collection;

public class TestArrayList {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        //添加元素
        arrayList.add("10");
        arrayList.add("20");
        arrayList.add("30");
        arrayList.add("40");
        //集合的长度
        System.out.println(arrayList.size());
        //得到第二个元素,索引是从0开始的
        System.out.println(arrayList.get(1));
        //判断集合是否为空
        System.out.println(arrayList.isEmpty());
        //寻找某元素的位置
        System.out.println(arrayList.indexOf("40"));
        //返回某位置之间的元素[ )
        System.out.println(arrayList.subList(0,2));

        ArrayList arrayList1 = new ArrayList();
        arrayList1.add("50");
        System.out.println(arrayList1.addAll(arrayList));
        //将集合元素转换为数组
        Object[] objects = arrayList1.toArray();
        for (int i = 0; i < objects.length; i++) {
            System.out.println(objects[i]);
        }
    }
}

LinkedList集合

  • ArrayList集合在查询元素时速度很快,但在增删元素效率较低
  • LinkedList集合是一个双向循环链表
  • LinkedList集合对于元素的增删操作效率很高,遍历和查找的效率低
方法声明功能描述
push()在集合首部添加元素
removeFirst()删除集合第一个
pollLast()删除集合最后一个元素
peek()获取集合第一个元素
package top.dty.collection;

import java.util.LinkedList;

public class TestLinkedList {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        //添加元素
        linkedList.add("str1");
        linkedList.add("str2");
        System.out.println(linkedList);

        //在集合首部添加元素
        linkedList.push("first" );
        System.out.println(linkedList);

        //获取集合第一个元素
        Object o = linkedList.peek();
        System.out.println(o);

        //删除集合第一个和最后一个元素
        linkedList.removeFirst();
        linkedList.pollLast();
        System.out.println(linkedList);
    }
}

Collection集合遍历

Iterator遍历集合

Iterator主要用于迭代访问(遍历)Collection中的元素,因此Iterator对象也被称为迭代器

  • 当遍历集合时,首先通过调用t集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素
  • 在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历
package top.dty.collection;

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

public class TestIterator {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add("10");
        arrayList.add("20");
        arrayList.add("30");
        
        Iterator iterator = arrayList.iterator();
        while (iterator.hasNext()){
            Object o = iterator.next();
            System.out.println(o);
        }
        
    }
}

foreach遍历集合

foreach循环是一种更见简洁的佛如循环,也称增强for循环

for (Object o : arrayList) {
    System.out.println(o);
}

foreach循环在循环遍历集合和数组,只能访问集合中的元素不能对其中的元素进行修改

用forEach()方法来遍历函数

迭代器forEachRemaining()方法来遍历

package top.dty.collection;

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

public class TestForeach {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add("10");
        arrayList.add("20");
        arrayList.add("30");
        for (Object o : arrayList) {
            System.out.println(o);
        }
        System.out.println("==========");
        //用forEach()方法来遍历函数
        arrayList.forEach((obj-> System.out.println(obj)));
        System.out.println("==========");
        //迭代器forEachRemaining()方法来遍历
        Iterator iterator = arrayList.iterator();
        iterator.forEachRemaining((obj-> System.out.println(obj)));
    }
}

Set接口

  • Set接口继承自Collection接口,比Collection接口更加严格
  • Set接口中的元素无序,并且以某种给规则保证存入的元素不会重复
  • Set接口主要有两个实现类,分别是HashSet和TreeSet
  • HashSet是根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能
  • TreeSet是以二叉树的方式来存储元素,可以实现对集合中的元素进行排序

HashSet集合

  • 无序不重复,集合内元素顺序与添加时元素顺序不一致
  • HashSet集合之所以能确保不出现重复的元素,是因为它在存入元素时做了很多工作。当调用HashSet集合的add()方法存入元素时,首先调用当前存入元素的hashCode()方法获得对象的哈希值,然后根据对象的哈希值计算出一个存储位置;如果该位置上没有元素,则直接将元素存人;如果该位置上有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较。如果返回的结果为false 就将该元素存入集合;返回的结果为true则说明有重复元素,就将该元素舍弃。
package top.dty.collection;

import java.util.HashSet;
//重写hashCode()和equals()方法
public class TestHashSet {
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        hashSet.add("jack");
        hashSet.add("eve");
        hashSet.add("rose");
        hashSet.add("jack");
        hashSet.forEach(o -> System.out.println(o));

        HashSet hs = new HashSet();
        Student student1 = new Student("1","xiao");
        Student student2 = new Student("2","duan");
        Student student3 = new Student("2","duan");
        hs.add(student1);
        hs.add(student2);
        hs.add(student3);
        System.out.println(hs);
    }
}
class Student{
    private String id;
    private String name;

    public Student() {
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
    public int hashCode(){
        return id.hashCode();
    }
    public boolean equals(Object obj){
        if(this == obj){
            return true;
        }
        if(!(obj instanceof Student)){
            return false;
        }
        Student stu = (Student) obj;
        boolean b = this.id.equals(stu.id);
        return b;
    }
}

TreeSet集合

TreeSet是Set接口的另一个实现类,它内部采用平衡二叉树来存储元素,这样的结构可以保证TreeSet集合没有重复分元素,并且可以对元素进行排序

常用方法

方法声明功能描述
first()获取首个元素
last()获取最后一个元素
floor()获取集合中小于或等于*的最大一个元素
higher()获取集合大于*的最小一个元素
pollFirst()删除第一个元素,并返回对象
pollLast()删除最后一个元素,并返回对象
package top.dty.collection;

import java.util.TreeSet;

public class TestTreeSet {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        //添加元素
        treeSet.add(5);
        treeSet.add(10);
        treeSet.add(1);
        treeSet.add(7);
        System.out.println(treeSet);
        //获取首个元素
        System.out.println(treeSet.first());
        //获取最后一个元素
        System.out.println(treeSet.last());
        //集合中小于或等于*的最大一个元素
        System.out.println(treeSet.floor(9));
        //集合大于*的最小一个元素
        System.out.println(treeSet.higher(4));
        System.out.println(treeSet.higher(10));
        //删除元素,并返回对象
        Object o = treeSet.pollFirst();
        System.out.println(o);
        System.out.println(treeSet);
    }
}

Java提供了两种TreeSet的排序规则,分别是:自然排序和定制排序

自然排序

自然排序要求向TreeSet集合中存储的元素所在类必须实现Comparable接口,并且重写compareTo()方法,然后TreeSet集合就会对该类型元素使用compareTo()方法进行比较,并且默认进行升序排序

package top.dty.collection;

import java.util.TreeSet;

public class TestTreeSet02 {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        treeSet.add(new Teacher("Jack",19));
        treeSet.add(new Teacher("Rose",18));
        treeSet.add(new Teacher("Tom",19));
        treeSet.add(new Teacher("Rose",18));
        System.out.println(treeSet);
    }
}
class Teacher implements Comparable{
    String name;
    int age;

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

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        Teacher teacher = (Teacher) o;
        if(this.age-teacher.age>0){
            return 1;
        }
        if(this.age-teacher.age == 0){
            return this.name.compareTo(teacher.name);
        }
        return -1;
    }
}
定制排序

有自己排序要求的时候使用

  • 创建集合时,传入Comparator接口实现定制排序规则
  • 创建集合时,使用Lambda表达式定制排序规则
package top.dty.collection;

import java.util.Comparator;
import java.util.TreeSet;

public class TestTreeSet03 {
    public static void main(String[] args) {
        //方法1;创建集合时,传入Comparator接口实现定制排序规则
        TreeSet treeSet = new TreeSet((Comparator) new MyComparator());
        treeSet.add("jack");
        treeSet.add("helena");
        treeSet.add("eve");
        System.out.println(treeSet);
        //方法2;创建集合时,使用Lambda表达式定制排序规则
        TreeSet treeSet1 = new TreeSet((obj1,obj2) -> {
            String s1 = (String) obj1;
            String s2 = (String) obj2;
            return s1.length() - s2.length();
        });
        treeSet1.add("jack");
        treeSet1.add("helena");
        treeSet1.add("eve");
        System.out.println(treeSet1);
    }
}
class MyComparator implements Comparator{

    //定制排序方式
    public int compare(Object obj1,Object obj2) {
        String str1 = (String) obj1;
        String str2 = (String) obj2;
        int temp = str1.length()-str2.length();
        return temp;
    }

}

Map接口

Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。Map中的映射关系是一对一的,一个键对象Key对于唯一一个值对象Value,其中键对象Key和值对象Value可以时任意数据类型,并且键对象Key不允许重复,这样在访问Map集合中的元素时,只要指定了Key,就能找到对应的Value。

HashMap集合(简单)

  • HashMap集合是Map接口的一个实现类,它用于储存键值映射关系,该集合的键和值允许为空,但键不能重复,且集合中的元素是无序的
  • HashMap底层是由哈希表结构组成的,其实就是“数组+链表”的组合体,数组是HashMap的主体结构,链表则主要是为了解决哈希值冲突而存在的分支结构

Map集合常用方法

方法声明功能描述
put()向HashMap存储键值对象
containsKey()查看键对象是否存在
get()获取指定键对象映射的值
keySet()获取集合中的键对象
values()获取集合中的值对象
replac()替换指定对象映射的值
remove()删除指定键对象映射的键值对元素
package top.dty.collection;

import java.util.HashMap;

public class TestHashMap {
    public static void main(String[] args) {
        HashMap hashMap = new HashMap();
        //向HashMap存储键值对象
        hashMap.put("1","Jack");
        hashMap.put("2","Rose");
        hashMap.put("3","Luck");
        hashMap.put("4","Luck");
        hashMap.put("1","Tom");
        System.out.println(hashMap);
        //查看键对象是否存在
        System.out.println(hashMap.containsKey("1"));
        //获取指定键对象映射的值
        System.out.println(hashMap.get("1"));
        //获取集合中的键对象和值对象
        System.out.println(hashMap.keySet());
        System.out.println(hashMap.values());
        //替换指定对象映射的值
        hashMap.replace("1","Tom");
        System.out.println(hashMap);
        //删除指定键对象映射的键值对元素
        hashMap.remove("1");
        System.out.println(hashMap);
    }
}

LinkedHashMap集合

LinkedHashMap集合是HashMap的子类,和LinkedList一样也是使用双向链表来维护内部元素的关系,使LinkedHashMap元素迭代的顺序与簇内的顺序一致

package top.dty.collection;

import java.util.HashMap;
import java.util.LinkedHashMap;

public class TestLinkedHashMap {
    public static void main(String[] args) {
        HashMap hashMap = new HashMap();
        hashMap.put("2","Jack");
        hashMap.put("1","Rose");
        hashMap.put("4","Luck");
        hashMap.put("3","Tom");
        System.out.println(hashMap);
        hashMap.forEach((key,value) -> System.out.println(key+":"+value));

        LinkedHashMap linkedHashMap = new LinkedHashMap();
        linkedHashMap.put("2","Jack");
        linkedHashMap.put("1","Rose");
        linkedHashMap.put("4","Luck");
        linkedHashMap.put("3","Tom");
        System.out.println(linkedHashMap);
        linkedHashMap.forEach((key,value) -> System.out.println(key+":"+value));
    }
}

TreeMap集合(简单)

  • TreeMap集合是Map接口的一个实现类,它用于储存键值映射关系,该集合的键和值允许为空,但键不能重复,且集合中的元素是无序的
  • 在TreeMap内部是通过二叉树的原理来保证键的唯一性
  • TreeMap中所有的键是按照某种顺序排列的(默认升序)
  • 可以通过比较器Comparator的方式对所有的键进行定制排序
package top.dty.collection;

import java.util.Comparator;
import java.util.TreeMap;

public class TestTreeMap {
    public static void main(String[] args) {
        TreeMap treeMap = new TreeMap(new CustomComparator());
        treeMap.put("2","Rose");
        treeMap.put("1","Jack");
        treeMap.put("3","Luck");
        treeMap.put("1","Tome");
        System.out.println(treeMap);
    }
}
//通过比较器Comparator的方式对键降序排列
class CustomComparator implements Comparator{

    @Override
    public int compare(Object o1, Object o2) {
        String key1 = (String) o1;
        String key2 = (String) o2;
        return key2.compareTo(key1);
    }
}

Properties集合

  • Map接口还有一个实现类Hashtable,它和HashMap十分相似
  • Hashtable是线程安全的
  • Hashtable有一个重要的子类Properties
  • Properties集合类来存取应用的配置项
package top.dty.collection;

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

public class TestProperties {
    public static void main(String[] args) throws IOException {
        //1.通过Properties进行属性文件读取操作
        Properties properties = new Properties();
        //加载要读取的文件的绝对路径
        properties.load(new FileInputStream("D:\\Application\\IntelliJ IDEA Community Edition 2021.1.2\\JAVASE\\JAVA学习\\src\\txt.properties"));
        //遍历txt.properties键值对元素信息
        properties.forEach((k,v) -> System.out.println(k+":"+v));
        //2.通过Properties进行属性文件写入操作
        //指定要写入操作文件名称和位置
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\Application\\IntelliJ IDEA Community Edition 2021.1.2\\JAVASE\\JAVA学习\\src\\txt.properties");
        //向Properties类文件进行写入键值对信息
        properties.setProperty("charset","UTF-8");
        //将此Properties集合中新增键值对信息写入配置文件
        properties.store(fileOutputStream,"新增charset编码");
    }
}

Map集合遍历

一般使用Iterator迭代器遍历Map集合和forEach(Consumer action)方法遍历结合

Iterator迭代器遍历Map集合

使用Iterator迭代器遍历Map集合,需要先将Map集合转换为Iterator接口对象,然后进行遍历,由于Map集合中元素是由简直对组成的,所以使用Iterator接口遍历Map集合时,会有两种方法keySet()方法和entrySet()方法

keySet()方法

keySet()方法需要先将Map集合中所有舰队下转换为Set单列集合,接着将包含舰队下的Set集合转换为Iterrator接口对象,然后遍历Map集合中所有的键,再根据键获取相应的值

package top.dty.collection;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class TestMapKeySet {
    public static void main(String[] args) {
        HashMap hashMap = new HashMap();
        hashMap.put("1","Jack");
        hashMap.put("2","Rose");
        hashMap.put("3","Luck");
        hashMap.put("4","Tom");
        System.out.println(hashMap);
        //获取键的集合
        Set keySet = hashMap.keySet();
        //迭代键的集合
        Iterator iterator = keySet.iterator();
        while ((iterator.hasNext())){
            Object key = iterator.next();
            Object value = hashMap.get(key);//获取对应键的值
            System.out.println(key+":"+value);
        }
    }

}
entrySet()方法

entrySet()方法将原有Map集合中的键值对作为一个整体返回为Set集合,截至将包含键值对对象的Set集合转换为Interator接口对象,然后获取集合中的所有键值对映射关系,再从映射关系中取出键和值

package top.dty.collection;

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

public class TestMapEntrySet {
    public static void main(String[] args) {
        HashMap hashMap = new HashMap();
        hashMap.put("1","Jack");
        hashMap.put("2","Rose");
        hashMap.put("3","Luck");
        hashMap.put("4","Tom");
        System.out.println(hashMap);
        Set entrySet = hashMap.entrySet();
        Iterator iterator = entrySet.iterator();
        while (iterator.hasNext()){
            //获取集合中键值对映射关系
            Map.Entry entry = (Map.Entry) (iterator.next());
            Object key = entry.getKey();
            Object value = entry.getValue();
            System.out.println(key+":"+value);
        }
    }

}

forEach(Consumer action)方法遍历结合

package top.dty.collection;

import java.util.Collection;
import java.util.HashMap;

public class TestMapForEach {
    public static void main(String[] args) {
        HashMap hashMap = new HashMap();
        hashMap.put("1","Jack");
        hashMap.put("2","Rose");
        hashMap.put("3","Luck");
        hashMap.put("4","Tom");
        System.out.println(hashMap);
        hashMap.forEach((key,value) -> System.out.println(key+":"+value));
        Collection values = hashMap.values();
        values.forEach(v -> System.out.println(v));
    }
}

泛型

  • 集合可以储存任意类型的对象元素,当把一个对象存入集合后,集合就会”忘记“这个对象的而类型,将该对象从集合中取出时,这个对象的编译类型就统一变成Object类型。

  • 泛型可以限定操作的数据类型,在定义集合类时,可以使用”<参数化类型>“的方式只当该集合中存储的数据类型

      ArrayList<参数化类型> list = new ArrayList<参数化类型>();
    

实例

package top.dty.collection;

import java.util.ArrayList;

public class TestGeneric {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("String");
        list.add("Collection");
    for (String s: list) {
            System.out.println(s);
        }
    }
}

集合工具类

Collections工具类

Collections类中提供类名大量的静态方法用于对集合中元素进行排序,查找和修改等操作

常用方法

方法声明功能描述
addAll()将所有指定元素添加到指定集合中
reverse()反转指定List集合中元素的排序
shuffle()对List集合中的元素进行随机排序
sort()根据元素的自然排序对List集合中的元素进行排序
swap()将指定List集合中角标i处元素和j处元素进行交换
max()根据元素的自然排序,返回给定集合中最大的元素
min()根据元素的自然排序,返回给定集合中最小的元素
replaceAll()用一个新值newVal替换List集合中所有的旧值oldVal
binarySearch()集通过二分搜索指定对象在List集合中的索引,查找的List集合中的元素必须有序
package top.dty.collection;

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

public class TestCollections {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        //将所有指定元素添加到指定集合中
        Collections.addAll(list,"C","Z","B","K");
        System.out.println(list);
        //反转指定List集合中元素的排序
        Collections.reverse(list);
        System.out.println(list);
        //对List集合中的元素进行随机排序
        Collections.shuffle(list);
        System.out.println(list);
        //根据元素的自然排序对List集合中的元素进行排序
        Collections.sort(list);
        System.out.println(list);
        //将指定List集合中角标i处元素和j处元素进行交换
        Collections.swap(list,0,list.size()-1);
        System.out.println(list);

        ArrayList<Integer> arrayList = new ArrayList<>();
        Collections.addAll(arrayList,1,2,-2,5,4,-7);
        System.out.println(arrayList);
        //根据元素的自然排序,返回给定集合中最大的元素
        System.out.println(Collections.max(arrayList));
        //根据元素的自然排序,返回给定集合中最小的元素
        System.out.println(Collections.min(arrayList));
        //用一个新值newVal替换List集合中所有的旧值oldVal
        Collections.replaceAll(arrayList,2,0);
        System.out.println(arrayList);
        //使用二分查找前,必须保证蒜素有序
        Collections.sort(arrayList);
        System.out.println(arrayList);
        //集通过二分搜索指定对象在List集合中的索引,查找的List集合中的元素必须有序
        int i = Collections.binarySearch(arrayList, 4);
        System.out.println(arrayList);
    }
}

Arrays工具类

Arrays工具类除了提供了一个集合工具类Collections,话针对数组操作提供了一个数组工具类——Arrays。Arrays工具类提供了大量针对数组操作的静态方法

  • 通过copyOfRange方法拷贝指定数组中指定长度的数组,超出范围的用默认值0(不怕破坏原数组的情况下)
  • 通过fill方法将一个数组中的所有元素替换成同一个元素
package top.dty.collection;

import java.util.Arrays;

public class TestArrays {
    public static void main(String[] args) {
        int[] arr = {9,8,3,5,2};
        printArray(arr);
        Arrays.sort(arr);
        printArray(arr);
        //集通过二分搜索指定对象在集合中的索引,查找的List集合中的元素必须有序
        int i = Arrays.binarySearch(arr, 3);
        System.out.println(i);
        //通过copyOfRange方法拷贝指定数组中指定长度的数组,超出范围的用默认值0
        int[] copyOfRange = Arrays.copyOfRange(arr, 1, 7);
        printArray(copyOfRange);
        //通过fill方法将一个数组中的所有元素替换成同一个元素
        Arrays.fill(arr,6);
        printArray(arr);
    }

    //定义打印数组元素方法
    public static void printArray(int[] arr){
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i != arr.length-1){
                System.out.print(arr[i]+",");
            }else {
                System.out.println(arr[i]+"]");
            }
        }
    }
}

聚合操作(Stream接口)

Stream接口

Stream接口可以将集合,数组中的元素转换为Stream流的形式,并结合Lambda表达式的又是来进一步简化集合,数组中的元素查找,过滤,转换等操作,者一i性能功能就是聚合操作

  • 将原始集合或数组对象转换为Stream流对象
  • 对Stream流对象中元素进行一系列的过滤,查找等中间操作,然后仍然返回一个Stream流对象
  • 对Stream流对象进行遍历,统计,收集等操作,获取想要的结果

创建Stream流对象

  • 使用集合对象的stream()静态方法创建Stream流对象
  • 使用Stream接口的of()静态方法创建Stream流对象
  • 使用Arrays数组工具的stream()静态方法创建Stream流对象
package top.dty.collection;

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

public class TestStream02 {
    public static void main(String[] args) {
        Integer[] array = {9,8,3,5,2};
        List<Integer> list = Arrays.asList(array);
        //1.使用集合对象的stream()静态方法创建Stream流对象
        Stream<Integer> stream1 = list.stream();
        stream1.forEach(i -> System.out.print(i+" "));
        System.out.println();
        //2.使用Stream接口的of()静态方法创建Stream流对象
        Stream<Integer> stream2 = Stream.of(array);
        stream2.forEach(i -> System.out.print(i+" "));
        System.out.println();
        //3.使用Arrays数组工具的stream()静态方法创建Stream流对象
        Stream<Integer> stream3 = Arrays.stream(array);
        stream3.forEach(i -> System.out.print(i+" "));
        System.out.println();

        Stream<String> stream = Stream.of("a1", "b2", "c3", "d4", "c1", "c6");
        stream.filter(s -> s.startsWith("c"))
                .map(String::toUpperCase)
                .sorted()
                .forEach(System.out::println);

    }
}

Stream流的常用方法

方法声明功能描述
中间方法
filter()将指定流对象中的二元酸进行过滤,并返回一个子流对象
map()将流中的元素按规则映射到两一个流中
distinct()删除流中重复的元素
sorted()将流中的元素按自然顺序排序
limit()截取流中元素的长度
skip()丢弃流中前n个元素
long count()统计流中元素的个数
终结方法
collect()将流中的方法收集到一个容器中
toArray()将流中的元素收集到一个数组中
forEach()将流中的元素进行遍历

forEach(System.out::println)打印流元素

package top.dty.collection;

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

public class TestStream01 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("小刘");
        list.add("小王");
        list.add("小张");
        list.add("小小段");
        System.out.println(list);
        //1.创建一个Stream流对象
        Stream<String> stream = list.stream();
       //2.对Stream流中的元素分别进行过滤,截取操作
        Stream<String> stream1 = stream.filter(i -> i.startsWith("小"));
        Stream<String> stream2 = stream1.limit(2);
        //3.对Stream流中的元素进行终结操作,进行遍历输出
        stream2.forEach(i -> System.out.println(i));
        System.out.println("==============");
        //通过链式表达式的形式文成聚合操作
        list.stream().filter(i ->i.startsWith("小"))
                .filter(i -> i.length()>2)
                .limit(2)
                .forEach(j -> System.out.println(j));

        List<String> list1 = list.stream().filter(i -> i.startsWith("小"))
                .collect(Collectors.toList());
        System.out.println(list1);

        String collect = list.stream().collect(Collectors.joining("and"));
        System.out.println(collect);
          //统计流中元素个数
        long count = list.stream().count();
        System.out.println(count);
    }
}

Parallel Stream(并行流)

  • 串行流就是将数据转换为一个流对象,然后在单线程执行聚合操作的流(单一管道流),前面所学的Stream就是
  • 并行流就是将源数据分为多个子流对象进行多线程操作(多个管道),然后将处理结果再汇总为一个流对象
  • 串行流和并行流都是属于Stream流对象,拥有相同的方法操作
  • 在创建Stream流对象是,除非特别声明,否则默认创建都是串行流

创建并行流

  • 直接使用Collection接口的parallelStream()创建并行流
  • 使用BaseStream接口的parallel()方法将串行流转变为并行流
package top.dty.collection;

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

public class TestParallelStream {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("张明", "王五", "张伟", "李四", "张三");
        //1.直接使用Collection接口的parallelStream()创建并行流
        Stream<String> parallelStream = list.parallelStream();
        //判断流对象是否是并行流
        System.out.println(parallelStream.isParallel());

        Stream<String> stream = Stream.of("张明", "王五", "张伟", "李四", "张三");
        //2.使用BaseStream接口的parallel()方法将串行流转变为并行流
        Stream<String> parallel = stream.parallel();
        System.out.println(parallel.isParallel());
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值