集合

集合

1 集合常用方法

public static void main(String[] args) {
        // 创建集合
        Collection<String> collection = new ArrayList<>();
        System.out.println(collection);
        // 添加数据
        collection.add("丁真");
        collection.add("马嘉祺");
        collection.add("蔡徐坤");
        collection.add("黄子韬");
        collection.add("肖战");
        collection.add("鹿晗");
        collection.add("吴亦凡");
        // 清空集合
//        collection.clear();
        // 判断是否包含某个元素
        boolean contains = collection.contains("马嘉祺");
        System.out.println(contains);
        // 判断集合是否是空
        boolean empty = collection.isEmpty();
        System.out.println(empty);
        // 删除元素
        boolean remove = collection.remove("张艺兴");
        System.out.println(remove);
        // 集合的实际元素个数
        int size = collection.size();
        System.out.println(size);
        // 把集合转换成数组
        String[] array =  collection.toArray(new String[0]);
        for (String o : array) {
            System.out.println(o.substring(1));
        }
        System.out.println(collection);
    }

2 List接口

2.1 List接口的介绍

特点:

  • 有序的集合
  • 方法具有索引
  • 允许存储重复的元素
public static void main(String[] args) {
        // 创建集合
        List<String> list = new ArrayList<>();
        // 添加数据
        list.add("赵本山");
        list.add("宋丹丹");
        list.add("范伟");
        list.add("宋小宝");
        list.add("宋丹丹");
        // 插入元素
        list.add(2,"赵四");
        // 获取指定索引处的元素
        // IndexOutOfBoundsException 索引越界
        String s = list.get(3);
        System.out.println(s);
        // 获取元素首次出现的索引  找不到就返回-1
        int indexOf = list.indexOf("郭德纲");
        System.out.println(indexOf);
        // 获取元素最后一次出现的索引
        int lastIndexOf = list.lastIndexOf("宋丹丹");
        System.out.println(lastIndexOf);
        // 删除指定索引处的元素
        String remove = list.remove(2);
        System.out.println(remove);
        // 修改指定索引处的元素
        String string = list.set(1, "高秀敏");
        System.out.println(string);
        System.out.println(list);

        // 截取子列表  包头不包尾
        List<String> strings = list.subList(1, 3);
        System.out.println(strings);
    }

2.2 List接口的实现类--ArrayList

ArrayList底层的数据结构是数组

内存是连续的

增删速度相对慢

查询速度相对快

异步线程不安全的集合

当第一次添加数据时会创建长度为10的数组

每次扩容是原来容量 + 原来容量 / 2

public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("aa");
        // 把容量变成实际个数
        arrayList.trimToSize();
    }

2.3 实现ArrayList

package cn.javasm.demo;

import java.util.Arrays;
import java.util.Objects;

/**
 * @className: ArrayList
 * @description:
 * @author: gfs
 * @date: 2025/7/7 10:52
 * @version: 0.1
 * @since: jdk17
 */
public class ArrayListDemo {

    // 存储数据的数组
    private String[] data;
    // 元素的实际个数
    private int size;

    // 定义无参的构造方法
    public ArrayListDemo(){
        data = new String[10];
    }

    // 定义有参的构造方法
    public ArrayListDemo(int len){
        // 判断参数是否合法
        if (len < 0) throw new IllegalArgumentException();

        data = new String[len];
    }

    /**
     * 添加元素方法
     */
    public void add(String str){
        // 判断是否需要扩容
        if (size == data.length){
            grow();
        }
        data[size++] = str;
    }

    /**
     * 数组扩容方法
     */
    private void grow() {
        if (data.length <= 1)
            data = Arrays.copyOf(data,data.length + 1);
        else
            data = Arrays.copyOf(data,data.length + (data.length >> 1));
    }

    /**
     * 插入元素
     * @param index  要插入的索引
     * @param str    要插入的数据
     */
    public void add(int index,String str){
        // 判断索引是否越界
        if (index < 0 || index > size) throw new IndexOutOfBoundsException("数组越界了");
        // 判断是否需要扩容
        if (size == data.length) grow();

        // 插入元素
        // 方式一:
        // 其实就是将数据统一向后挪动一位,然后腾出来的那一位赋值要插入的数据即可
//        for (int i = size - 1; i >= index;i--){
//            data[i + 1] = data[i];
//        }
        // 方式二:
        // 参数一:要拷贝的数组
        // 参数二:要拷贝的数组的起始索引
        // 参数三:要拷贝到的数组
        // 参数四:要拷贝到的数组的起始索引
        // 参数五:要拷贝的数据的长度
        System.arraycopy(data,index,data,index+1,size - index);
        data[index] = str;

        // 实际元素个数 + 1
        size++;
    }

    /**
     * 删除指定索引处的元素
     * @param index
     */
    public void remove(int index){
        // 判断索引是否越界
        out(index);

        // 删除元素就是将后面的元素统一向前挪动一位
        // 方式一:
//        for (int i = index;i < size - 1;i++){
//            data[i] = data[i + 1];
//        }
        // 方式二:
        System.arraycopy(data,index + 1,data,index,size - index - 1);
        // 实际元素个数-1
        size--;
        // 最后一位设置为null
        data[size] = null;
    }

    private void out(int index) {
        if (index < 0 || index >= size) throw new IndexOutOfBoundsException();
    }

    /**
     * 获取指定元素首次出现的索引
     * @param str
     * @return
     */
    public int indexOf(String str){
        for (int i = 0; i < size; i++) {
//            if (str == data[i] || (str != null && str.equals(data[i]))){
//
//            }
            if (Objects.equals(str,data[i])){
                return i;
            }
        }
        return -1;
    }

    /**
     * 删除指定的元素
     * @param str  要删除的元素
     */
    public void remove(String str){
        int i = indexOf(str);
        // 找到了元素就删除
        if (i != -1) remove(i);
    }

    /**
     * 清空集合
     */
    public void clear(){
        data = new String[10];
        size = 0;
    }

    /**
     * 判断是否包含指定的元素
     * @param str  指定的元素
     * @return  true包含    false不包含
     */
    public boolean contains(String str){
        return indexOf(str) != -1;
    }

    /**
     * 获取指定索引处的元素
     * @param index  指定索引
     * @return 元素
     */
    public String get(int index){
        // 判断索引是否越界
        out(index);
        return data[index];
    }

    /**
     * 判断集合是否为空
     * @return true 为空  false 不为空
     */
    public boolean isEmpty(){
        return size == 0;
    }

    /**
     * 替换元素
     */
    public void set(int index,String str){
        // 判断是否越界
        out(index);
        data[index] = str;
    }

    // 获取元素个数
    public int size(){
        return size;
    }

    public ArrayListDemo subList(int fromIndex,int toIndex){
        // 判断索引是否越界
        out(fromIndex);
        out(toIndex);
        // 判断参数是否合法
        if (fromIndex > toIndex) throw new IllegalArgumentException();

        // 创建新的列表
        ArrayListDemo sublist = new ArrayListDemo(toIndex - fromIndex);
        System.arraycopy(this.data,fromIndex,sublist.data,0,toIndex - fromIndex);
        // 设置列表实际元素个数
        sublist.size = toIndex - fromIndex;
        return sublist;
    }

    @Override
    public String toString() {
//        [1, 2, 3]
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        for (int i = 0; i < size; i++) {
            if (i != size - 1){
                stringBuilder.append(data[i]).append(", ");
            }else {
                stringBuilder.append(data[i]);
            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }
}

2.4 List接口的实现类--LinkedList

  • 底层数据结构是双向不循环链表
  • 内存的不连续的
  • 增删相对快
  • 查询相对慢
  • 异步线程不安全的集合

image-20250707151721572

2.5 实现LinkedList

package cn.javasm.demo;

import com.sun.jdi.connect.spi.TransportService;

import java.util.Objects;

/**
 * @className: LinkedListDemo
 * @description:
 * @author: gfs
 * @date: 2025/7/7 15:33
 * @version: 0.1
 * @since: jdk17
 */
public class LinkedListDemo {

    /**
     * 实际元素个数
     */
    private int size;

    /**
     * 头节点
     */
    private Node first;

    /**
     * 尾节点
     */
    private Node last;

    /**
     * 私有内部类
     */
    private class Node {
        /**
         * 数据
         */
        String data;

        /**
         * 上一个节点
         */
        Node prev;

        /**
         * 下一个节点
         */
        Node next;

        public Node(String data, Node prev, Node next) {
            this.data = data;
            this.prev = prev;
            this.next = next;
        }
    }

    public int getSize() {
        return size;
    }

    public Node getFirst() {
        return first;
    }

    public Node getLast() {
        return last;
    }

    /**
     * 添加元素
     *
     * @param str 要添加的元素
     */
    public void add(String str) {
        // 创建节点
        Node node = new Node(str, null, null);
        // 添加元素分为两种情况
        // 如果当前是第一个节点,那么头节点和尾节点都是同一个
        if (size == 0) {
            this.first = node;
        } else {
            this.last.next = node;
            node.prev = this.last;
        }
        this.last = node;
        size++;
    }

    /**
     * 插入元素
     * @param index  要插入的索引
     * @param str    要插入的数据
     */
    public void add(int index,String str){
        // 判断索引是否越界
        if (index < 0 || index > size) throw new IndexOutOfBoundsException("索引越界");

        // 插入元素分为三种情况
        // 1.插入到尾部  和添加元素方法相同,直接调用添加元素方法
        if (index == size){
            add(str);
            return;
        }
        // 2.插入头部
        // 创建新节点
        Node node = new Node(str,null,null);
        if (index == 0){
            node.next = this.first;
            this.first.prev = node;
            this.first = node;
        }else {
            // 3.插入到中间
            Node no = getNode(index);

            no.prev.next = node;
            node.prev = no.prev;
            node.next = no;
            no.prev = node;
        }
        size++;
    }

    private void out(int index) {
        if (index < 0 || index >= size) throw new IndexOutOfBoundsException("索引越界");
    }

    /**
     * 删除指定索引处的元素
     * @param index  指定的索引
     */
    public void remove(int index){
        // 判断索引是否越界
        out(index);
        // 1.删除头节点
        if (index == 0){
            this.first = this.first.next;
            this.first.prev = null;
        }else if (index == size - 1){
            // 2.删除尾节点
            this.last = this.last.prev;
            this.last.next = null;
        }else {
            // 删除中间节点
            // 获取指定索引处的节点
            Node no = getNode(index);
            no.prev.next = no.next;
            no.next.prev = no.prev;
        }
        // 实际元素个数-1
        size--;
    }

    /**
     * 根据索引返回索引处的节点
     * @param index  索引
     * @return  节点
     */
    private Node getNode(int index) {
        Node no = first;
        for (int i = 0; i < index; i++) {
            no = no.next;
        }
        return no;
    }

    /**
     * 查询指定元素首次出现的索引
     */
    public int indexOf(String str){
        // 获取头节点
        Node node = this.first;
        // 遍历查询
        for (int i = 0; i < size; i++) {
            if (Objects.equals(node.data,str)){
                return i;
            }
            node = node.next;
        }
        return -1;
    }

    /**
     * 删除指定的元素
     */
    public void remove(String str){
        // 获取元素首次出现的索引
        int index = indexOf(str);
        if (index != -1){
            this.remove(index);
        }
    }

    /**
     * 清空集合
     */
    public void clear(){
        this.first = this.last = null;
        size = 0;
    }

    /**
     * 判断包含指定的元素
     */
    public boolean contains(String str){
        return indexOf(str) != -1;
    }

    /**
     * 获取指定索引处的元素
     */
    public String get(int index){
        // 判断是否越界
        out(index);
        return getNode(index).data;
    }

    /**
     * 判断链表是否为空
     */
    public boolean isEmpty(){
        return size == 0;
    }

    /**
     * 替换元素
     */
    public void set(int index,String str){
        // 判断是否越界
        out(index);
        // 替换元素
        getNode(index).data = str;
    }

    /**
     * 截取子列表
     * @param fromIndex   开始索引
     * @param toIndex     结束索引
     * @return 新的子列表
     */
    public LinkedListDemo subList(int fromIndex,int toIndex){
        // 判断是否越界
        out(fromIndex);
        out(toIndex);
        // 判断参数是否合法
        if (fromIndex > toIndex) throw new IllegalArgumentException();

        // 创建子链表
        LinkedListDemo sublist = new LinkedListDemo();
        // 获取fromIndex处的节点
        Node node = getNode(fromIndex);
        // 循环添加节点中的元素到新的子链表中
        for (int i = fromIndex;i < toIndex;i++){
            sublist.add(node.data);
            node = node.next;
        }

        return sublist;
    }

    @Override
    public String toString() {
        // 创建拼接字符串对象
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        Node node = first;
        for (int i = 0; i < size; i++) {
            if (i != size - 1){
                stringBuilder.append(node.data).append(", ");
            }else {
                stringBuilder.append(node.data);
            }
            node = node.next;
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }
}

```### 2.6 Vector

Vector的特点:

- 内部数据结构是数组,内存连续
- 查询速度快
- 增删速度慢
- 同步线程安全的集合
- 如果不需要线程安全实现,建议使用 [`ArrayList` ](https://doc.qzxdp.cn/jdk/17/zh/api/java.base/java/util/ArrayList.html)代替 `Vector`。
- 默认初始容量是10
- 默认的向量增量是0
- 如果向量增量是0,那么扩容是原来容量+原来容量  
- 如果向量增量不是0,那么扩容是原来容量+向量增量







### 2.7 迭代器

- 古老迭代器

```java
public static void main(String[] args) {
        Vector<String> vector = new Vector<>(15,5);
        vector.add("aa");
        vector.add("bb");
        vector.add("cc");
        vector.add("dd");
        // 古老迭代器   遍历集合
        Enumeration<String> elements = vector.elements();
        while (elements.hasMoreElements()){
            String s = elements.nextElement();
            System.out.println(s);
        }
        System.out.println(vector);
    }
  • 现代迭代器
public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("洛阳");
        list.add("安阳");
        list.add("南阳");
        list.add("信阳");
        list.add("驻马店");
        list.add("开封");
        list.add("许昌");
        list.add("新乡");
        // 获取迭代器
//        Iterator<String> iterator = list.iterator();
//        // 在java中是不允许一边遍历一边增删
//        // 判断是否有下一个元素
//        while (iterator.hasNext()){
//            // 获取下一个元素
//            String next = iterator.next();
//            System.out.println(next);
//            // 实际上是遍历完之后统一删除
//            iterator.remove();
////            list.remove(next);
//        }
        // 匿名内部类
//        list.forEach(new Consumer<String>() {
//            // 自动把元素通过参数传入方法中
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });
        // lambda表达式
//        list.forEach(s -> System.out.println(s));
        list.forEach(System.out::println);
//        System.out.println(list);
    }

2.8 Stack类

Stack类是Vector的子类,也拥有Vector的特点

public static void main(String[] args) {
        Stack<String> stack = new Stack<>();
        // 压栈
        stack.push("石家庄");
        stack.push("郑州");
        stack.push("武汉");
        stack.push("兰州");
        // 弹栈   获取并移除栈顶元素
        // EmptyStackException
//        String pop = stack.pop();
//        System.out.println(pop);
        // 弹栈   获取栈顶元素
//        String peek = stack.peek();
//        System.out.println(peek);
        boolean empty = stack.empty();
        System.out.println(empty);
        // 从栈顶向栈底搜索,位置从1开始
        int i = stack.search("郑州");
        System.out.println(i);
        System.out.println(stack);
    }

自定义Stack类

package cn.javasm.demo;

import java.util.Arrays;
import java.util.EmptyStackException;
import java.util.Objects;

/**
 * @className: ArrayStack
 * @description:
 * @author: gfs
 * @date: 2025/7/8 11:00
 * @version: 0.1
 * @since: jdk17
 */
public class ArrayStack {
    // 底层的数组
    private String[] data = new String[10];
    // 实际元素个数
    private int size;

    /**
     * 判断是否为空
     */
    public boolean empty(){
        return size == 0;
    }

    /**
     * 返回栈顶元素
     */
    public String peek(){
        // 判断栈是否为空
        if (size == 0) throw new EmptyStackException();

        return data[size - 1];
    }

    /**
     * 返回和删除栈顶元素
     */
    public String pop(){
        // 获取栈顶元素
        String str = peek();
        // 实际长度-1
        size--;
        return str;
    }

    /**
     * 压栈
     */
    public void push(String str){
        if (size >= data.length){
            data = Arrays.copyOf(data,data.length * 2);
        }
        // 添加元素
        data[size++] = str;
    }

    /**
     * 搜索元素
     * @param str
     * @return
     */
    public int search(String str){
        // 方式一
//        for (int i = size - 1,j = 1;i >= 0;i--,j++){
//            if (Objects.equals(str,data[i])){
//                return j;
//            }
//        }
        // 方式二
        for (int i = size - 1;i >= 0;i--){
            if (Objects.equals(str,data[i])){
                return size - i;
            }
        }
        return -1;
    }
}

2.9 List接口的排序方法

    public static void main(String[] args) {
        // 创建一个列表
        List<String> list = new ArrayList<>();
        // 添加元素
        list.add("dfds");
        list.add("grgwe");
        list.add("adgfa");
        list.add("frgg");
        list.add("kukth");
        list.add("brthgrt");

        // 排序
//        list.sort(new A());
        // 匿名内部类
//        list.sort(new Comparator<String>() {
//            @Override
//            public int compare(String o1, String o2) {
//                return o1.charAt(0) - o2.charAt(0);
//            }
//        });
        // lambda表达式
        list.sort((o1,o2) -> o1.charAt(0) - o2.charAt(0));
        System.out.println(list);



        List<Person> personList = new ArrayList<>();
        personList.add(new Person("萧峰",30,98));
        personList.add(new Person("段誉",18,96));
        personList.add(new Person("虚竹",25,99));
//        personList.sort(new Comparator<Person>() {
//            @Override
//            public int compare(Person o1, Person o2) {
//                return o1.getScore() - o2.getScore();
//            }
//        });
        // lambda表达式
        personList.sort((a,b) -> a.getScore() - b.getScore());
        personList.forEach(System.out::println);
    }

3 Set接口

Set接口中不包含重复的元素

3.1 HashSet类

特点:

  • 底层是哈希表
  • 元素不能重复
  • 元素是无序的
  • 元素的位置可能发生改变
  • 异步线程不安全的
  • HashMap底层是数组加链表加红黑树
  • 可以指定初始容量和加载因子,指定的初始容量一定是2的n次方的形式
  • 当链表长度>8,并且数组长度>=64,那么会把链表扭转成红黑树
  • 当红黑树的长度<=6,会把红黑树扭转成链表

3.2 LinkedHashSet类

特点:

  • 底层结构是哈希表和双向链表
  • 有序的
  • 异步线程不安全的
		LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.add("逍遥子");
        linkedHashSet.add("曲非烟");
        linkedHashSet.add("木婉清");
        linkedHashSet.add("东方不败");
        System.out.println(linkedHashSet);

3.3 TreeSet类

public static void main(String[] args) {
        // 如果是字符串,会按照字符进行升序的排序
        TreeSet<String> treeSet = new TreeSet<>();
        treeSet.add("lala");
        treeSet.add("ufo");
        treeSet.add("nba");
        treeSet.add("abc");
        treeSet.add("aad");
        System.out.println(treeSet);

        // 在TreeSet中的元素对应的类必须实现Comparable接口
        TreeSet<Person> treeSet1 = new TreeSet<>();
        treeSet1.add(new Person("刘亦菲",37,90));
        treeSet1.add(new Person("赵雅芝",70,100));
        treeSet1.add(new Person("杨幂",40,95));
        System.out.println(treeSet1);
    }
public class Person implements Comparable<Person>{    
/**
     * 当前的对象和传入的对象进行比较
     * 如果返回值是正值,那么当前对象放在传入对象的后面
     * 如果返回值是负值,那么当前对象放在传入对象的前面
     * @param o the object to be compared.
     * @return
     */
    @Override
    public int compareTo(Person o) {
        return this.score - o.getScore();
    }
}

4 Queue

Queue称之为队列接口,通常以FIFO(First In First Out)先进先出形式排序

public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();
        // 添加元素
//        queue.add("杨颖");
//        queue.add("迪丽热巴");
//        queue.add("古力娜扎");
//        queue.add("张若男");
//        queue.offer("赵丽颖");
        // 获取并删除元素
        // 如果没有元素返回null
//        String poll = queue.poll();
//        System.out.println(poll);
//        // 如果没有元素抛出NoSuchElementException
//        String remove = queue.remove();
//        System.out.println(remove);
        // 获取元素 如果没有元素抛出NoSuchElementException
//        String element = queue.element();
//        System.out.println(element);
        // 获取元素  如果没有元素,返回null
        String peek = queue.peek();
        System.out.println(peek);
        System.out.println(queue);
    }

5 泛型

泛型是jdk1.5的特性,保证程序的安全性,减少了代码量,避免了类型的强制转换

优点:把运行时的问题提前到了编译阶段

泛型可以定义在类,接口和方法上面

5.1 泛型类

在类的后面添加<>,一般使用大写字母来表示泛型

E: element 元素

T: type 类型

R: result 结果

K: key 键

V: value 值

如果有多个泛型,使用,隔开

public class Student<E,A> {

    private E name;

    private A age;

    public A getAge() {
        return age;
    }

    public void setAge(A age) {
        this.age = age;
    }

    public void setName(E name){
        this.name = name;
    }

    public E getName(){
        return name;
    }
}

5.2 接口中的泛型

public interface MyInter <E>{
    void show(E e);
}
// 定义实现类实现接口,但是不实现泛型
class MyInterImpl<E> implements MyInter<E>{

    @Override
    public void show(E e) {
        System.out.println(e);
    }
}

// 实现接口并且实现泛型
class MyInterImpl2 implements MyInter<Integer>{

    @Override
    public void show(Integer integer) {
        System.out.println(integer);
    }
}

5.3 方法中的泛型

// 方法的泛型
    public <K> void test(K k){
        System.out.println(k);
    }

5.4 泛型的上限和下限

// 针对所有的数值的集合操作
    // 泛型的上限: ? extends XX  表示是XX类\接口 或者是XX类的子类\子接口
    public static void print(List<? extends Number> list){

    }

    // 泛型的下限: ? super XX 表示是XX类\接口  或者是XX类的父类\父接口
    public static void test(List<? super String> list){

    }

5.5 泛型的应用

  • 自定义枚举
package cn.javasm.demo;

/**
 * @className: AxiosStatus
 * @description:
 * @author: gfs
 * @date: 2025/7/8 16:28
 * @version: 0.1
 * @since: jdk17
 */
public enum AxiosStatus {

    OK(200,"success"),
    ERROR(50000,"操作失败"),
    PHONE_NOT_FOUND(110,"手机号未找到"),
    NOT_FOUND(404,"资源未找到");

    private int code;

    private String message;

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    AxiosStatus(int code, String message) {
        this.code = code;
        this.message = message;
    }
}

  • 自定义返回类型
package cn.javasm.demo;

/**
 * @className: AxiosResult
 * @description:
 * @author: gfs
 * @date: 2025/7/8 16:31
 * @version: 0.1
 * @since: jdk17
 */
public class AxiosResult<T> {

    private int code;

    private String message;

    private T data;

    private static <T> AxiosResult<T> setData(AxiosStatus axiosStatus,T t){
        AxiosResult<T> axiosResult = new AxiosResult<>();
        axiosResult.setCode(axiosStatus.getCode());
        axiosResult.setMessage(axiosStatus.getMessage());
        axiosResult.setData(t);
        return axiosResult;
    }

    /**
     * 成功 携带数据
     */
    public static <T> AxiosResult<T> success(T t){
        return setData(AxiosStatus.OK,t);
    }

    /**
     * 成功 不携带数据
     */
    public static <T> AxiosResult<T> success(){
        return setData(AxiosStatus.OK,null);
    }

    /**
     * 失败
     */
    public static <T> AxiosResult<T> error(){
        return setData(AxiosStatus.ERROR,null);
    }

    /**
     * 自定义的失败
     */
    public static <T> AxiosResult<T> error(AxiosStatus axiosStatus){
        return setData(axiosStatus,null);
    }

    /**
     * 自定义的失败 携带数据
     */
    public static <T> AxiosResult<T> error(AxiosStatus axiosStatus,T t){
        return setData(axiosStatus,t);
    }


    private AxiosResult(){}


    private AxiosResult(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "AxiosResult{" +
                "code=" + code +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }
}

6 Stream流

Stream流是一种流式结构,是JDK1.8出现的特性,对于集合做聚合操作。Stream流中所有的接口都是函数式接口,可以使用lambda表达式

6.1 获取Stream流的方式

public static void main(String[] args) {
        // 创建一个集合
        List<Integer> list = Arrays.asList(1,2,3,4,5,6);
        // 获取流
        // 方式一:
        Stream<Integer> stream = list.stream();
        
        // 方式二:
        List<Integer> list1 = Arrays.asList(1,2,3,4,5,6);
        List<Integer> list2 = Arrays.asList(6,5,4,7,8,3);
        List<Integer> list3 = Arrays.asList(5,4,3,8,7);
        Stream<Integer> stream1 = list1.stream();
        Stream<Integer> stream2 = list2.stream();
        Stream<Integer> stream3 = list3.stream();
        // 合并流
        Stream<Integer> concat = Stream.concat(stream1, stream2);
        Stream<Integer> concat1 = Stream.concat(concat, stream3);
    }

6.2 常用方法

  • 案例一:对指定的集合数据进行去重,然后降序排列。并且获取前3个最大值。
    public static void main(String[] args) {
//        对指定的集合数据进行去重,然后降序排列。并且获取前3个最大值。
        // 传统方式
        List<Integer> list = new ArrayList<>();
        // 向集合中添加元素
        Collections.addAll(list,23,1,45,6,7,22,8,7,45,3);
        // 把集合转换成TreeSet
//        TreeSet<Integer> integers = new TreeSet<>(list);
//        System.out.println(integers);
//
//        List<Integer> datalist = new ArrayList<>();
//        for (int i = 0; i < 3; i++) {
//            datalist.add(integers.pollLast());
//        }
//        System.out.println(datalist);
        // 方式二
        // 获取流对象  一个stream对象只能操作一次
        Stream<Integer> stream = list.stream();
        // 去重
        Stream<Integer> distinct = stream.distinct();
        // 排序
//        Stream<Integer> sorted = distinct.sorted(new Comparator<Integer>() {
//            @Override
//            public int compare(Integer o1, Integer o2) {
//                return o2 - o1;
//            }
//        });
        // 默认是升序   Comparator.reverseOrder() 降序
        Stream<Integer> sorted = distinct.sorted(Comparator.reverseOrder());
        // 获取一定的数量内容
        Stream<Integer> limit = sorted.limit(3);
        // 终止操作  把流转换成集合
//        limit.count();
        List<Integer> collect = limit.collect(Collectors.toList());
        System.out.println(collect);

        // 方式三
        //lambda表达式
//        List<Integer> collect = list.stream().distinct().sorted(Comparator.reverseOrder()).limit(3).collect(Collectors.toList());
//        System.out.println(collect);
    }
  • 案例二: 通过多个list中最大最小值,平均值,求和。降序排序并去重后获取结果。
public static void main(String[] args) {
//        统计多个list中最大最小值,平均值,求和。降序排序并去重后获取结果
        // 定义三个集合
        List<Integer> list1 = Arrays.asList(3,2,5,6,1,8);
        List<Integer> list2 = Arrays.asList(5,6,2,8,9,10);
        List<Integer> list3 = Arrays.asList(11,4,56,2,78,3,1);
        // 合并流
//        Stream<Object> stream = Stream.of(list1, list2, list3).flatMap(new Function<List<Integer>, Stream<?>>() {
//            // 把每个集合传进来获取集合的流
//            @Override
//            public Stream<?> apply(List<Integer> integers) {
//                return integers.stream();
//            }
//        });

        // 合并流后去重降序转换成集合
        List<Integer> collect = Stream.of(list1, list2, list3).flatMap(List::stream).distinct().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
        System.out.println(collect);

//        collect.stream().mapToInt(new ToIntFunction<Integer>() {
//            @Override
//            public int applyAsInt(Integer value) {
//                return value.intValue();
//            }
//        });
        // 把集合转换成int类型 获取统计对象
        IntSummaryStatistics intSummaryStatistics = collect.stream().mapToInt(Integer::intValue).summaryStatistics();
        // 平均值
        System.out.println(intSummaryStatistics.getAverage());
        // 最大值
        System.out.println(intSummaryStatistics.getMax());
        // 最小值
        System.out.println(intSummaryStatistics.getMin());
        // 和
        System.out.println(intSummaryStatistics.getSum());

    }
```- 统计集合中名字带j,分数score>75的人,根据成绩进行降序排序,根据id进行升序排序

```java
public static void main(String[] args) {
        // 统计集合中名字带j,分数score>75的人,根据成绩进行降序排序,根据id进行升序排序
        List<Student> students = Arrays.asList(
                new Student().setId(1001).setName("james").setScore(80),
                new Student().setId(1004).setName("jim").setScore(90),
                new Student().setId(1002).setName("jerry").setScore(90),
                new Student().setId(1003).setName("tom").setScore(98),
                new Student().setId(1005).setName("jay").setScore(40)
        );
        // 创建集合
//        List<Student> datalist = new ArrayList<>();
//        for (Student student : students) {
//            if (student.getName().contains("j") && student.getScore() > 75){
//                datalist.add(student);
//            }
//        }
//        System.out.println(datalist);
//
////        根据成绩进行降序排序,根据id进行升序排序
//        datalist.sort(Comparator.comparing(Student::getScore).reversed().thenComparing(Student::getId));
//        System.out.println(datalist);

//        List<Student> collect = students.stream().filter(new Predicate<Student>() {
//            // 返回true的元素会留在集合中 返回false的元素会被筛选掉
//            @Override
//            public boolean test(Student student) {
//                return student.getName().contains("j") && student.getScore() > 75;
//            }
//        }).collect(Collectors.toList());
        List<Student> collect = students.stream()
                .filter((s -> s.getName().contains("j") && s.getScore() > 75))
                .sorted(Comparator.comparing(Student::getScore).reversed().thenComparing(Student::getId))
                .collect(Collectors.toList());
        System.out.println(collect);
    }
  • 案例四: 把集合中的学生名称转换成大写,并且求名称中带e的同学
public static void main(String[] args) {
        // 统计集合中名字带j,分数score>75的人,根据成绩进行降序排序,根据id进行升序排序
        List<Student> students = Arrays.asList(
                new Student().setId(1001).setName("james").setScore(80),
                new Student().setId(1004).setName("jim").setScore(90),
                new Student().setId(1002).setName("jerry").setScore(90),
                new Student().setId(1003).setName("tom").setScore(98),
                new Student().setId(1005).setName("jay").setScore(40)
        );
//        List<String> collect = students.stream().map(new Function<Student, String>() {
//            @Override
//            public String apply(Student student) {
//                return student.getName().toUpperCase();
//            }
//        }).collect(Collectors.toList());
        List<String> collect = students.stream()
                .map(student -> student.getName().toUpperCase())
                .filter(s -> s.contains("E"))
                .collect(Collectors.toList());
        System.out.println(collect);
    }
  • 案例五:给每一个同学都加5分
   public static void main(String[] args) {
        // 统计集合中名字带j,分数score>75的人,根据成绩进行降序排序,根据id进行升序排序
        List<Student> students = Arrays.asList(
                new Student().setId(1001).setName("james").setScore(80),
                new Student().setId(1004).setName("jim").setScore(90),
                new Student().setId(1002).setName("jerry").setScore(90),
                new Student().setId(1003).setName("tom").setScore(98),
                new Student().setId(1005).setName("jay").setScore(40)
        );
//        List<Student> collect = students.stream().map(new Function<Student, Student>() {
//            @Override
//            public Student apply(Student student) {
//                student.setScore(student.getScore() + 5);
//                return student;
//            }
//        }).collect(Collectors.toList());
//        List<Student> collect = students.stream().map(student -> {
//            student.setScore(student.getScore() + 5);
//            return student;
//        }).collect(Collectors.toList());

//        List<Student> collect = students.stream().peek(new Consumer<Student>() {
//            @Override
//            public void accept(Student student) {
//                student.setScore(student.getScore() + 5);
//            }
//        }).collect(Collectors.toList());
        List<Student> collect = students.stream().peek(student -> student.setScore(student.getScore() + 5)).collect(Collectors.toList());
        System.out.println(collect);
    }

补充:断点调试

BUG:虫子 漏洞

调试:DEBUG

F8 执行下一行

F9 跳到下一个断点

posted @ 2025-07-07 22:09  小胡coding  阅读(7)  评论(0)    收藏  举报