lambda是一个匿名函数,我们可以把lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。
Consumer : 消费型接口
void accept(T t);
Supplier : 供给型接口
T get();
Function
R apply(T t);
Predicate : 断言型接口
boolean test(T t);
若lambda体中的内容有方法已经实现了,我们可以使用“方法引用”(可以理解方法引用是lambda表达式的另一种表现形式)
主要有三种语法格式:
对象::实例方法名
类::静态方法名
类::实例方法名
注:当lambda能被方法引用替代时,idea编译器会有提示。
流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据,流讲的是计算”。
注意:
stream自己不会存储元素
stream不会改变源对象,相反它们会返回一个持有结果的新stream
stream操作是延迟执行的,这意味着它们会等到需要结果的时候才执行
举例:
filter
limit
skip(n) :扔掉前n个元素
distinct :筛选去重 类对象需要重写hashcode和equals方法才能生效
map:接收lambda。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
sorted( Comparator comparator ):排序
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何处理。而在终止操作时一次性全部处理,称为“惰性求值”。
allMatch(Predicate super T> predicate) 集合元素全匹配 返回boolean
anyMatch(Predicate super T> predicate) 集合元素任意一个匹配 返回boolean
noneMatch(Predicate super T> predicate) 集合元素不匹配 返回boolean
findFirst() 返回集合中第一个元素
findAny() 并行流返回集合中任意一个元素,串行流返回第一个元素
count() 返回集合大小
max(Comparator super T> comparator) 返回最大元素
min(Comparator super T> comparator) 返回最小元素
collect(Collector super T, A, R> collector) 接收一个Collector接口的实现,用于给Stream中元素做汇总的方法
顾名思义串行流就是串行执行的流,并行流就是并行执行的流。
并行流就是把内容分割成多个数据块,每个数据块对应一个流,然后用多个线程分别处理每个数据块中的流。底层由Fork/Join框架提供线程池实现并行处理。
并非并行流效率一定高,例如:数组易拆分成多块执行,而链表就很难拆分。且并行流意味着会占用更多的内存,所以应该酌情使用。
Optional 类 (java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在用 Optional 可以更好的表达这个概念;并且可以避免空指针异常
Optional.of(T t):创建一个 Optional 实例
Optional.empty(T t):创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则空实例
isPresent():判断是否包含某值
orElse(T t):如果调用对象包含值,返回该值,否则返回 t
orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f):如果有值对其处理,并返回处理后的 Optional,否则返回 Optional.empty()
flatmap(Function mapper):与 map 相似,要求返回值必须是 Optional