lambda表达式

lambda表达式是一个匿名函数,我们可以把 Lambda 表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。 但是在java中,是没有函数这个概念的。另外,依旧Java“万事万物皆对象”思想,java将lambda表达式做为一个接口(函数式接口,下面会说明)的实例。 首先,我们来感受下…

方法引用与构造器引用

方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用。 方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式。所以方法引用也是函数式接口的一个实例。通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致。 语法格式:类…

lambda变量作用域

访问外围变量 lambda表达式可以捕获外围作用域中变量的值。 var str1 = "hello"; var str2 = "java"; testConsumer(str1, str-> System.out.println(str + " " + str2) ); 但在lambda表示式中,不能修改外围变量的值。下面的做法是不…

泛型概述

集合容器类在 设计阶段/声明阶段 不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。 泛型的概念 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属…

泛型类与泛型方法

泛型类 泛型类的声明 interface List 和 class GenTest<K,V> 其中,T,K,V不代表值,而是表示类型。这里使用任意字母都可以。 常用T表示,是Type的缩写。 泛型类的实例化 一定要在类名后面指定类型参数的值(类型)。如: List<String> strList = new ArrayList<String>(); Iterat…

擦拭法

java的虚拟机是没有泛型类型对象的,所有的对象都属于普通类。 擦拭法 无论什么时候定义一个泛型,编译的时候都会自动的匹配一个相应的原始类。这个原始类名就是去掉类型参数后的泛型类型名。类型变量会被擦除,替换为限定类型,或Object(没有限定时)。 例如一个泛型类Pair如下: class Pair<T> { private T first; private T second; pub…

泛型限制与局限性

1.不能使用基本类型代替类型参数,因为基本数据类型么有继承自Object。 ArrayList<int> //错误 ArrayList<Integer> // ok 2.运行时查询只适用于原始类 if (order instanceof Order<Integer>) { // error } if (order instanceof Order<T&gt…

泛型与继承

类型变量的限定 有时,类或方法需要对类型变量加以约束。下面是一个典型的例子,我们要计算数组中的最小元素: class ArrayListUnit { public static <T> T t (T …args) { T item = args[0]; for (int i=1; i < args.length; i++) if (item.compareTo(args[i]…

通配符的使用

无限定通配符 使用类型通配符:? 比如:List<?>,Map<?,?> bool containsAll(Collection<?> c) List<?>是List、List等各种泛型List的父类。 list<?>可读,但不能写。 下面以可读特性举例2个: class Util { public static void show (A…

集合概述

在没有学习集合之前,我们用来存储多个对象的时候只能采用数组的方式。但是Java中的数组有一些缺点非常明显: 数组的长度在声明的时候就确定了,不能动态的修改 数组中提供的属性和方法少,不便于进行添加、删除、插入等操作,且效率不高。同时无法直接获取存储元素的个数。 获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用 数组存储数据的特点:有序、可重复。对于无序、不可重复的需求,不能满足。 集合…