Lambda表达式
lambda表达式, 是Java8的一个新特性, 也是Java8中最值得学习的新特性之一。
lambda表达式, 是一个匿名函数。 可以使用使用这个匿名函数, 实现接口中
的方法。 对接口进行非常简洁的实现, 从而简化代码。
集合框架
集合与数组类似, 是一个数据容器, 用来存储引用数据类型的数据。 在Java中, 集合不是
泛指某一个类, 而是若干个类组成的数据结构的实现。
集合类这种框架是高性能的
数组中可以存储基本数据类型的数据, 也可以存储引用数据类型的数据
集合中只能存储引用数据类型的数据, 基本数据类型的数据需要进行装箱, 才能存
入集合中。
数组是定长的容器, 一旦实例化完成, 数组的长度不能发生改变。 即数组不能动态
添加、删除元素。
集合是变长的容器, 长度可以发生改变。 即集合中可以随时添加、删除元素。
数组只能通过下标进行元素的访问, 如果需要其他的操作, 例如排序, 需要自己写
算法实现。
集合中封装了若干对元素进行操作的方法, 直接使用集合, 比较方便。
使用集合的好处
降低编程难度
提升程序的运行速度和质量
无需再学习新的APl
增加代码重用性
Java中的集合,大致分为两类。分别是 Collection 集合和 Map 集合
lambda表达式,只能实现函数式接口。
一个接口中, 要求实现类必须实现的抽象方法, 有且只有一个! 这样的接口, 就
是函数式接口。
@FunctionalInterface
是一个注解, 用在接口之前, 判断这个接口是否是一个函数式接口。 如果是函数式接口,
没有任何问题。 如果不是函数式接口, 则会报错。
lambda表达式, 其实本质来讲, 就是一个匿名函数。在写lambda表达式的时候, 也不需要关心返回值类型。
只需要关注两部分内容即可: 参数列表 和 方法体
lambda表达式的基础语法:
(参数) -> {
方法体
};
参数部分 : 方法的参数列表, 要求和实现的接口中的方法参数部分一致, 包括参数的数量
和类型。
方法体部分 : 方法的实现部分, 如果接口中定义的方法有返回值, 则在实现的时候, 注意
返回值的返回
-> : 分隔参数部分和方法体部分。
参数的类型
由于在接口的方法中,已经定义了每一个参数的类型是什么。 而且在使用lambda表
达式实现接口的时候, 必须要保证参数的数量和类型需要和接口中的方法保持一
致。 因此, 此时lambda表达式中的参数的类型可以省略不写。
注意事项:
如果需要省略参数的类型, 要保证: 要省略, 每一个参数的类型都必须省略不
写。 绝对不能出现, 有的参数类型省略了, 有的参数类型没有省略
参数的小括号
如果方法的参数列表中的参数数量 有且只有一个 ,此时,参数列表的小括号是可以
省略不写的。
注意事项:
只有当参数的数量是一个的时候, 多了、少了都不能省略。
省略掉小括号的同时, 必须要省略参数的类型。
方法体大括号的精简
当一个方法体中的逻辑, 有且只有一句的情况下, 大括号可以省略
return的精简
如果一个方法中唯一的一条语句是一个返回语句, 此时在省略掉大括号的同时, 也
必须省略掉return。
语法:
类::静态方法
注意事项:
在引用的方法后面, 不要添加小括号。
引用的这个方法, 参数(数量、类型) 和 返回值, 必须要跟接口中定义的一致。
如果在lambda表达式中,使用到了局部变量,那么这个局部变量会被隐式的声明为 fifinal。
是一个常量, 不能修改值。
Collection集合
只占一列
Collection集合中, 没有下标的概念。
add(E element)
将一个指定类型的元素, 添加到集合的末尾。
addAll(Collection coll)
批量添加,将一个集合中的所有的元素,添加到
当前集合的末尾
remove(E ele)
删除集合中指定的元素。
removeAll(Collection
coll)
删除集合中所有的在参数集合中存在的元素(删
除交集)。
retainAll(Collection
coll)
保留集合中所有的在参数集合中存在的元素,删
除其他元素(保留交集)。
clear()
清空集合中的所有的数据
removeIf(Predicate
predicate)
删除集合中满足指定条件的数据。
contains(E ele)
判断一个集合中是否包含指定的元素。
containsAll(Collection
coll)
判断参数集合中, 是否所有的元素都在当前集合
中包含。
size()
获取集合中元素的数量, 类似于数组 length。
isEmpty()
判断一个集合是否是空集合。
toArray()
将集合中的元素,转成 Object 数组
toArray(T[] arr)
将集合中的元素,转成指定类型的数组
迭代器(Iterator)
使用next()方法, 向后移动一位元素指向, 并返回新的指向的元素。
如果使用next()方法, 向后移动指向的时候, 已经超出了集合的范围, 指向了一个不存
在的元素, 会抛出异常 NoSuchElenmentException。
一般情况下, 配合 hasNext() 方法一起使用的。
在使用迭代器进行元素的遍历过程中,不要使用集合的方法修改集合中的内容 !!! 否则,会出
现 ConcurrentModifificationException 。可以使用迭代器自带的remove()方法操作
List集合是单列集合,是Collection接口的子接口。Collection接口中所有的方法,这里都有。
同时,这个集合比Collection集合,多个若干方法。
在List接口中,是有下标的概念的。
List:存储的数据是有序的(元素的存储顺序与添加元素的顺序一致),可以重复的.
Set:存储的数据是无序的,不可以重复
add(int index, E element)
向集合中的指定的下标位插入一个元素
addAll(int index,
Collection coll)
在集合中指定的下标位插入另外一个集合中所
有的数据。
remove(int index)
删除集合中指定下标位的元素。
set(int index, E element)
修改指定下标位的值。
get(int index)
获取指定下标位的元素。
indexOf(E element)
获取集合中的某一个元素第一次出现的下标
lastIndexOf(E element)
获取集合中的某一个元素最后一次出现的下
标。
subList(int fromIndex, int
toIndex)
从一个集合中,截取一部分,作为子集合。
[from, to)。
replaceAll(UnaryOperator
operator)
将集合中的元素带入到接口方法中, 用返回值
替换原来的元素。
sort(Comparator
comparator)
将集合中的元素进行升序排序。
由于List接口是继承自Collection接口的,因此在Collection部分的三种遍历方式,都可以用来
遍历List集合。同时,在List集合中,还添加了两种用来遍历集合的其他方式。
下标遍历
顾名思义, 类似于数组的下标遍历。 遍历集合中的所有的下标, 依次获取指定下标位的元
素。
ListIterator 中新增了hasPrevious()和previous()方法
当我们使用hasnext()和next()方法实现从左到右遍历后,可以继续使用使用hasPrevious()和
previous()方法从右到左遍历