【第10章】接口与Lambda表达式
文章目录
- 一、接口
- 二、比较(排序)的两种方法
- 1、Comparable接口
- 2、Comparator 接口
- 三、Lambda表达式
- 1、Lambda表达式结构
- 2、函数式接口
- 3、方法引用
一、接口
简介:接口可用来实现多重继承,一个接口可以继承多个接口,一个类也可以继承多个接口,但是只能继承一个类。–>接口:多继承;类:单继承
1、接口声明:用 interface 关键字
格式:
[public] interface 接口名 [extends 超接口1,超接口2 ]{ //接口名后缀通常是able// 1. 常量的定义 //在接口中定义的任何变量都是常量[public final static] int STATUS = 100; //建议使用枚举类型来定义常量// 2. 抽象方法的定义[public abstract] 返回类型 方法名([参数]); //抽象方法只有声明,没有实现// 3. 静态方法的定义public static 返回值 静态方法名(){...}//静态方法不能被继承 //类只能通过 接口名.方法名() 访问接口中的静态方法// 4. 默认方法的定义: defaultpublic default 返回值 方法名(){...}}
如果没有public,该接口只能被同一个包中的类使用
2、接口实现:在类声明中用implements 接口,可以实现多个接口
[public] class 类名 implements 接口1,接口2,... {// 类体定义//访问抽象方法注意点:1、类(不是抽象类)中要实现接口所有的抽象方法,并且全都要用public修饰2、方法格式要和接口中声明的一致,可在上一行加上@Override 防止方法名写错//访问静态方法接口名.静态方法名()//解决从多个接口继承了相同的默认方法而产生的冲突的问题:1、在类体中定义一个新的默认方法的实现public 返回值 默认方法名(){ 自定义内容...}2、委托其中一个父接口中的默认方法public 返回值 默认方法名(){return Identified.super.默认方法名();}//如果从父类和接口继承了相同的方法,那么编译器自动遵循“类比接口优先”的原则/}
二、比较(排序)的两种方法
question:通过什么方法比较用户定义的类的对象的大小?
第一种是自然排序(从小到大):实现java.lang.Comparable 接口,使自定义的类天生具有比较大小的能力。
第二种是比较器排序:实现java.util.Comparator 接口 ,需要自定义比较器类。
自然排序和比较器排序特点比较:
自然排序,实现类继承Comparable接口,并重写compareTo()方法。Arrays.sort()中只需要传递1个比较对象的参数。
比较器排序,是在实现类的外部自定义一个比较器类,比较器类继承Comparator 接口,并重写compare()方法。Arrays.sort()中需传入两个参数:比较对象和比较器对象(new)。
1、Comparable接口
简介:Comparable<T>是泛型接口,泛型类型T会被替换成具体的类型。
可以实现:比较自定义的类中对象的(…)的大小,实现对象的自然排序
方法:定义在类的内部,自定义的类继承Comparable接口 + 实现compareTo()方法(具体比较什么在该方法中定义)
形式:
public class 类 implements Comparable<类型>{ ...public int compareTo(类型 参数){if(...) //当前对象的...>参数对象,返回1return 1;else if(...)return -1;else return 0; //相等返回0}public static void main(String[] args){类型[] 数组名= ... { ... };Arrays.sort(数组名);}
}
//eg:
import java.util.Arrays;
public class Circle implements Comparable<Circle>{//参数声明//构造方法...public double getArea(){return radius*radius*Math.PI;}//下面实现Comparable<T>接口的compareTo()@Overridepublic int compareTo(Circle circle){if(getArea() > circle.getArea()) //当前对象的面积>参数对象,返回1return 1;else if(getArea() < circle.getArea())return -1;else return 0; //相等返回0}public static void main(String[] args){Circle[] circles = new Circle[]{new Circle(2.5),new Circle(2.6),new Circle(2.7), }; //Circle类型的数组,注意此处用了匿名内部类circles[0].compareTo(circles[1]); //1、两个对象进行(面积上的)比较大小Arrays.sort(circles); //2、对数组进行从小到大排序,系统自动调用compareTo()方法for(Circle c : circles)System.out.printf("%6.2f%n",c.getArea()); //输出(对面积)排序的结果
}
2、Comparator 接口
基本形式:
import java.util.Comparator;
public class 类1 implements Comparator<类型>{ //先定义比较器类,@Overridepublic int compare(类型1 参数1, 类型2 参数2){ //在比较器中定义比较规则//简单的比较可以直接做减法然后return }
}
public class 类{pubic static void main(String[] args){类型[] 数组名= ... { ... };...Arrays.sort(数组名, new 类1() ) //new 类1() 是创建比较器对象} //也可以通过匿名内部类实现
}
//eg:使用匿名内部类实现比较器
//根据长度对字符串排序
import java.util.Comparator;
public class ComparatorDemo{pubic static void main(String[] args){String[] s = {"this","is","a","String"};Arrays.sort(s,new Comparator<String>(){@Overridepublic int compare(String first,String second){return first.length() - second.length();}});}
}
三、Lambda表达式
简介:Lambda表达式是可以传递给方法的一段代码,它可以是一个语句,也可以是一个代码块。
1、Lambda表达式结构
对象或者类.方法名(...(参数类型 参数1,参数类型 参数2) -> {//代码
});
//如果参数类型是可以通过 前面的参数或方法固定的参数类型 推导的, 那么可以省略
//如果参数类型可推导,且只有一个参数,那么 参数的()也可以省略 ★
//如果只有一行代码,{} 和 return关键字 可以省略
//eg:用Lambda表达式改写上面 使用匿名内部类实现比较器(根据长度对字符串排序)
Arrays.sort(s,(String first,String second) -> {return first.length() - second.length();});
//极简模式:
//由于前面的 参数s 是String类型的数组名,所以可以推导出 first和 second是String类型,所以参数类型可以省略
Arrays.sort(s,(first,second) -> first.length() - second.length());
2、函数式接口
简介:函数式接口指仅包含一个抽象方法的接口
注解: @FunctionalInterface
作用:适用于Lambda使用,为Lambda更简单地实现而定义
函数式接口+Lambda 的基本格式:
函数接口名 <...> 对象名 = 函数接口中方法的参数 -> 方法中的表达式
// <...>中的内容 和 参数的个数 根据具体的函数接口决定
我的理解:函数接口声明会先给出参数类型,这就满足了Lambda的语法:参数可推导即可省略 的条件,所以简化了Lambda表达式
在java.util.function包中定义了大量的函数式接口,它们使编写Lambda表达式变得容易。
(1)Function<T, R>接口定义了apply()方法。其中T:参数类型,R:结果类型
Function <参数类型, 结果类型>,它带一个参数,并返回一个值
BiFunction<参数类型,参数类型,结果类型>,它带两个参数,并返回一个值
import java.util.function.函数式接口名 //注意导入包
//使用匿名内部类实现
Function <Double,Double> fun = new Function <Double,Double>(){public Double apply(Double c){return 2*c;}
}
//使用Lambda表达式实现
Function <Double,Double> fun = c -> 2*c ;
BiFunction <Double,Double,Double> fun2 = (width,length) -> width*length ;
(2)Predicate<参数类型>接口定义了test()方法,它带一个参数T,返回一个布尔值
(3)Supplier<参数类型>接口定义了get()方法,它不带参数,返回一个值。
(4)Consumer<参数类型>接口定义了accept()方法,带一个参数,无返回值
3、方法引用
(1)方法引用
特点:用 :: 进行引用
有点不好解释,先看例子吧:
//不区分大小写进行比较
String[] names = {"One","two","Three"};
Arrays.sort(names,(x,y) -> x.compareToIgnoreCase(y)); //使用Lambda表达式实现比较器对象
//类名::实例方法名
Arrays.sort(names,String::compareToIgnoreCase);
使用方法:
对象::实例方法名 eg:System.out::println
类名::静态方法名 eg:list.removeIf(Objects::isNull);
类名::实例方法名 eg:String::compareToIgnoreCase
(2)构造方法引用
使用方法:
类名::new
数组::new
【第10章】接口与Lambda表达式相关推荐
- 【Java】 第六章 接口、lambda 表达式与内部类 Java核心技术卷1基础知识原书第10版 读书笔记
第六章 接口.lambda表达式与内部类 6. 接口.lambda 表达式与内部类 6.1 接口 6.1.1 接口概念 6.1.2 接口的特性 6.1.3 接口与抽象类 6.1.4 静态方法 6.1. ...
- CoreJava 笔记总结-第六章 接口、lambda表达式与内部类
文章目录 第六章 接口.lambda表达式与内部类 ==接口== 接口的概念 接口的属性 接口与抽象类 静态和私有方法 默认方法 解决默认方法冲突 接口与回调 `Comparator`接口 对象克隆 ...
- Java 核心技术卷1 --第六章 接口、lambda表达式和内部类
吧Github代码链接: https://github.com/deyou123/corejava.git 第六章 接口.lambda表达式和内部类 6.1 接口 6.1.1 接口概念 接口不是类,而 ...
- 10个Java 8 Lambda表达式经典示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...
- Lambda01 编程范式、lambda表达式与匿名内部类、函数式接口、lambda表达式的写法...
1 编程范式 主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 1.1 命令式编程 关注计算机执行的步骤,就是告诉计算机先做什么后做什么 1.2 声明式编程 表达程序的执行逻辑,就是告诉计算 ...
- java8 Lambda表达式的应用(函数式接口、lambda表达式,方法引用及Stream API)
之前写了一篇博客简单介绍了一下java 8发布新增的一些特性功能,java 8在2014年发布,距今也不少年了,但是lambda表达式使用并不熟练,现在一边学习,一边记录一下. 目录 一.Lambda ...
- java 函数式接口与lambda表达式的关系
函数式接口与lambda表达式的关系 在java中,lambda表达式与函数式接口是不可分割的,都是结合起来使用的. 对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没 ...
- JAVA学习笔记 15 - 函数式接口、Lambda表达式和方法引用
本文是Java基础课程的第十五课.主要介绍在JDK8中,Java引入的部分新特性,包括函数式接口.Lambda表达式和方法引用.这些新特性使得Java能够在按照面向对象思想进行开发的基础上,融合函数式 ...
- Java8函数式接口与Lambda表达式
摘要 何为函数式接口? 什么是lambda表达式,lambda表达式的本质: 函数式接口与lambda表达式的联系:lambda是实现函数式接口的一个快捷方式,可以作为函数式接口的一个实例: 常用Ja ...
- Java新特性:Java8函数式接口与Lambda表达式(一)
摘要 何为函数式接口? 什么是lambda表达式,lambda表达式的本质: 函数式接口与lambda表达式的联系:lambda是实现函数式接口的一个快捷方式,可以作为函数式接口的一个实例: 常用Ja ...
最新文章
- Windows Live Windows Phone 7
- self = [super init]
- oracle雾化试图_Oracle 物化视图 说明
- linux 之RAID详解
- javaScript第六天(2)
- JBoss BPM Travel Agency的微服务迁移故事
- 7-181 帅到没朋友 (20 分)
- 笨方法学python第四版当当_“笨办法”学Python(第3版)
- HDU2000 ASCII码排序【字符排序】
- javascript 不让成为nan_JavaScript高级,第一集
- saltstack高效运维
- 严蔚敏数据结构习题第五章
- servlet003:监听器
- wince之浅谈无线漫游
- 基于Hyperworks和LSDYNA的挤压仿真
- 超详细的新手8周跑步入门训练计划(从走跑开始)
- OpenMP 并行处理
- java程序内存占用过高问题排查
- 洛谷 P3258 [JLOI2014]松鼠的新家 树上差分
- linux中文化,linux中文化-语系