Java核心技术1:第六章接口、初识lambda

一、接口

1.接口的概念

  • 接口中的所有方法自动式public,在实现接口时,必须把方法声明为public,不然就是默认访问权限

  • 类的默认方法访问权限是包可见性,不是private,包可见性指同一个包内的类可以访问,private是谁都不能访问。

  • 接口可以包含多个方法,包含常量,但是不能有实例字段,接口绝不会实现方法,这是实现接口的类干的事情。

2.接口与抽象类

上边说了接口中不能实现具体方法,不能有实例字段,那么为什么不用抽象类而选择接口呢?

  • 1.抽象类必须有抽象函数
  • 2.一个子类只能扩展一个抽象类,但是可以实现多个接口

3.接口与回调callback

回调是指某个特定事件发生时应该采取的动作
比如利用定时器Timer类,隔一段时间就做出相应的操作,就是回调。
Timer类的构造函数中必须有相应动作的对象,而相应动作的类必须要继承ActionListener
在这里插入图片描述

每隔一段时间就做出动作的PrintTimer类:

public class TimePrinter implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) { //ActionEvent提供了事件的相关信息,包括时间,重写接口定义定时器到时的操作
        //定时1.打印当前时间
        System.out.println("准点报时,此时的时间为:"+ Instant.ofEpochMilli(e.getWhen()));
        //定时2.响铃
        Toolkit.getDefaultToolkit().beep();//getDefaultToolkit获得默认的工具箱,beep发生一声铃响
    }
}

将做出动作的对象传入定时器Timer类:

 public static void main(String[] args)
    {
        TimePrinter listener = new TimePrinter();
        //构造一个定时器,每隔1秒通知一次listener,动作监视对象listener就是定时器回调的对象
        Timer timer = new Timer(1000,listener);
        //定时开始
        timer.start();
        //显示截止对话框
        JOptionPane.showMessageDialog(null,"quit program?");
        System.exit(0);
    }

在这里插入图片描述

4.克隆clone

默认的克隆是浅拷贝,即对两个对象的子对象是共享的,当子对象不会变化的时候利用浅拷贝就够了,深拷贝则需要自己重新代码,克隆所有的子对象

二、lambda

5.1使用lambda的原因:

当一个程序需要反复的使用另一个段代码块的时候,不同于引入一个对象的便捷形式,如果这段引入的代码块十分冗长就需要使用lambda了。因为lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。
比如下面的重写优先级比较器的例子中,传统的方式优先队列需要传入一个Comparator的对象,先new再重写其中的compare函数,非常的麻烦,如果用lambda方法,就省去了new和重写Override注解的过程。而且比较器这种会频繁被优先级调用的代码越简洁越好。

5.2 lambda的语法

lambda举例:(Integer o1,Integer o2)->o2-o1
()中是函数传入的参数
->后边是函数体,这里没写return,因为会自动识别return 就是o2-o1
当函数体里边有if语句的时候需要把每一种情况都return,如:

(Integer a,Integer b)->
{
	if(a>b)return a;
	else return b;
}
5.3 举例:重写lambda的比较器

这里用一个优先队列重写比较器的例子来说明lambda
优先队列的比较器使用lambda重写

class compute {
    public static void main(String[] args) {

      PriorityQueue<Integer> que = new PriorityQueue<Integer>(new Comparator<Integer>() {
          @Override
          public int compare(Integer o1, Integer o2) {
              return o2-o1;
          }
      }
//                    (Integer o1,Integer o2)->o2-o1
        );
      que.add(5);
      que.add(10);
      que.add(3);
      que.add(20);
      que.add(1);
      while(!que.isEmpty()){
          System.out.println(que.poll().toString());
      }
    }
}

不使用lambda表达式的最小堆:
在这里插入图片描述使用lambda表达式的最大堆:
在这里插入图片描述#### 5.4 lambda实现函数式接口
在前边的回调函数可以改成

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值