lambda表达式
面向对象的编程中强调,必须通过对象的形式去做事情,函数式思想则是尽量忽略对象的复制写法,“强调做什么,而不是以什么形式去做”。
lamda表达式就是函数式思想的体现
lamda表达式就是一种定义函数的简化写法,不是函数调用的简化写法
lambda表达式格式
三要素:形式参数,箭头,代码块
形如:(形参)->(代码块)
形参:如果多个参数,参数之间逗号隔开,如果没有参数,得留空括号
->:英文中划线和大于号,固定写法,表示执行
代码块:具体要做的事情
使用前提:有接口:接口当中有且只有一个抽象方法(因为lambda表达式的箭头括号内,没有函数名称参数,所以区分不了那个参数)
泛型
就是一种不确定的数据类型。
泛型类的定义语法
class 类名 <泛型标识 , 泛型标识 , ..... >{ private 泛型标识 变量名; }
class GenericDemo<K>{ //定义数组 private K[] arr; }
常用的泛型标识符
T,E,K,V,?
本质上这些个都是通配符,没啥区别,只不过是编码时的一种约定俗成的东西。比如上述代码中的 T ,我们可以换成 A-Z 之间的任何一个 字母都可以,并不会影响程序的正常运行,但是如果换成其他的字母代替 T ,在可读性上可能会弱一些。
?表示不确定的 java 类型T (type) 表示具体的一个java类型K V (key value) 分别代表java键值中的Key ValueE (element) 代表Element
泛型类的使用语法
类名<具体的类型对象> 对象名 =new 类名 <具体的数据类型>()
类名<具体的类型对象> 对象名 =new 类名 <>()
jdk 1.7 之后,后面的<>可以省略不写
GenericDemo<String> genericDemo =new GenericDemo<String>(10);
GenericDemo genericDemo =new GenericDemo(10);
GenericDemo<String> genericDemo =new GenericDemo<>(10);
以上三种写法等价
泛型总结
类型参数化,让类的定义更加通用
泛型不支持基本数据类型,因为在编译时T编译成Object,基本类型无法转换为Object
泛型类在创建对象的时候,如果没有指定具体数据类型,将按照Object类型来操作
同一泛型类在逻辑上可以看成是多个不同的类型,但实际是相同类型
从泛型类派生子类
泛型接口的语法定义:
interface 接口名 <泛型标识1,泛型标识2>{
泛型标识 方式名();
…
}
子类也是泛型,子类和父类的泛型要保持一致,如果父类没有指明类型,则父类按照Object类型处理
package com.qcby.demo.generic; public class Parent<E>{ private E value; public E getValue() { return value; } public void setValue(E value) { this.value = value; } }
子类(无论是E还是T,子类是泛型要和父类的一致)
public class Child<E> extends Parent<E>{ }
子类不是泛型,父类要明确泛型类的数据类型,如果父类没有指明类型,则父类按照Object类型处理
public class Child2 extends Parent<String>{ @Override public String getValue() { return super.getValue(); } public static void main(String[] args) { Child<String> child =new Child<>(); child.setValue("123"); child.getValue(); } }
public class Child2 extends Parent{ @Override public Object getValue() { return super.getValue(); } public static void main(String[] args) { Child<String> child =new Child<>(); child.setValue("123"); child.getValue(); } }