Java的队列,外加一个自定义语法糖

Queue
找到java.util.Queue,可以看到其继承自java.util.Collection

public interface Queue<E> extends Collection<E> {
   
    boolean add(E e);
    
    boolean offer(E e);
    
    E remove();

    E poll();

    E element();

    E peek();
}

快捷键ctrl+h查看继承结构
在这里插入图片描述
其中java.util.concurrent.BlockingQueue阻塞队列,在线程池的构造方法中被使用到
在这里插入图片描述

队列Queue的几个方法(其父接口Collection方法的使用参考ArrayList)
(Queue的API了解后,其子类使用方式都相同,拿其子类LinkedBlockingQueue举例子)

public static void main(String[] args) {
        //队列就是用来放数据的集合,类似List<Integer> list = new ArrayList(); LinkedList也是一个队列
        Queue<String> queue = new LinkedBlockingQueue();
        //Queue的六个方法
        System.out.println("add添加一个元素"+queue.add("a"));
        System.out.println("offer添加一个元素"+queue.offer("b"));

        System.out.println("element返回第一个元素"+queue.element());
        System.out.println("peek返回第一个元素"+queue.peek());

        System.out.println("poll返回第一个元素,并在队列中删除"+queue.poll());
        System.out.println("remove返回第一个元素,并在队列中删除"+queue.remove());
        
        //区别 add()和remove()element()方法在失败的时候会抛出异常

    }

结果

add添加一个元素true
offer添加一个元素true
element返回第一个元素a
peek返回第一个元素a
poll返回第一个元素,并在队列中删除a
remove返回第一个元素,并在队列中删除b

异常演示

public static void main(String[] args) {
        Queue<String> queue = new LinkedBlockingQueue(2);
        //演示失败的情况,队列长度为2,超出时
        queue.add("a");
        queue.add("b");
        try {
            queue.add("c");
        } catch (Exception e) {
            System.out.println("add添加失败抛出异常" + e);
        }
        System.out.println("offer添加失败返回" + queue.offer("c"));
        //队列为空时
        queue.clear();
        
        try {
            queue.element();
        } catch (Exception e) {
            System.out.println("队列为空时element返回第一个元素异常" + e);
        }
        System.out.println("队列为空时peek返回第一个元素" + queue.peek());

        try {
            queue.remove();
        } catch (Exception e) {
            System.out.println("队列为空时remove返回第一个元素,并在队列中删除异常" + e);
        }
        System.out.println("队列为空时poll返回第一个元素,并在队列中删除" + queue.poll());
    }

结果

add添加失败抛出异常java.lang.IllegalStateException: Queue full
offer添加失败返回false
队列为空时element返回第一个元素异常java.util.NoSuchElementException
队列为空时peek返回第一个元素null
队列为空时remove返回第一个元素,并在队列中删除异常java.util.NoSuchElementException
队列为空时poll返回第一个元素,并在队列中删除null

可以看到代码很多try catch,可以封装一个语法糖(甚至你可以自己去扩展finally块)

/**
     * try catch 有点占行,封装一个语法糖
     * @param function 目标方法
     * @param param 参数
     * @param message 异常时信息
     * @param <P> 目标方法参数
     * @param <R> 目标方法结果
     * @return
     */
    public static <P, R> R doExecute(Function<P, R> function, P param, String message) {
        R result = null;
        try {
            result = function.apply(param);
        } catch (Exception e) {
            System.out.println(message + e);
        }
        return result;
    }

改造之后的代码就清爽很多

public static void main(String[] args) {
        Queue<String> queue = new LinkedBlockingQueue(2);
        //演示失败的情况,队列长度为2,超出时
        queue.add("a");
        queue.add("b");

        doExecute(parameter -> queue.add(parameter), "c","add添加失败抛出异常");
        System.out.println("offer添加失败返回" + queue.offer("c"));
        //队列为空时
        queue.clear();
		//这个参数“c”是可有可无的,不管你传什么,queue.element()并没有使用参数
        doExecute(parameter -> queue.element(), "c","队列为空时element返回第一个元素异常");
        System.out.println("队列为空时peek返回第一个元素" + queue.peek());

        doExecute(parameter -> queue.remove(), null,"队列为空时remove返回第一个元素,并在队列中删除异常");
        System.out.println("队列为空时poll返回第一个元素,并在队列中删除" + queue.poll());
    }

运行结果

add添加失败抛出异常java.lang.IllegalStateException: Queue full
offer添加失败返回false
队列为空时element返回第一个元素异常java.util.NoSuchElementException
队列为空时peek返回第一个元素null
队列为空时remove返回第一个元素,并在队列中删除异常java.util.NoSuchElementException
队列为空时poll返回第一个元素,并在队列中删除null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值