Java8学习
1.Lambda
可定义为一种简洁、可传递的匿名函数,Lambda本质上是一个函数,虽然它不属于某个特定的类,但具备参数列表、函数主体、返回类型,甚至能够抛出异常
Lambda是匿名的,它没有具体的函数名称
Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)
很明显 “->”箭头是lambda的特征
代码示例:
(String str) -> str.length() //返回给定字符串的长度(隐含return语句) () -> 233 //始终返回233的无参方法(隐含return语句) (User user) -> user.getAge() > 20 //返回当前用户是否年龄大于20岁,返回一个boolean值(隐含return语句) // 包含多行表达式,需用花括号括起来,并使用return关键字返回 (int x, int y) -> { int z = x*y; return x + z; }
使用Lambda与传统写法对比:
//使用Lambda Runnable r1 = () -> System.out.println("Hello world 1");
传统匿名类:
3.流失Java8引入的全新概念,它用来处理集合中的数据,暂且可以把它理解为一种高级集合
流的特点:
1.只能遍历一次
2.采用内部迭代方式:
若要对集合进行处理,则需要我们手写处理代码,这就叫外部迭代
而要对流进行处理,我们只需要告诉流我们需要什么结果,处理过程由流自行完成,这就成为内部迭代
流的操作过程:
分为:中间操作和终端操作
中间操作:当数据源中的数据上了流水线后,这个过程对数据进行的所有操作都称为“中间操作”。中间操作仍然会返回一个流对象,因此多个中间操作可以串起来形成一个流水线
终端操作:当所有的中间操作完成后,若要将数据从流水线上拿下来,则需要执行终端操作,终端操作将返回一个执行结果,这就是你想要的数据。
流的具体使用过程:1.准备一个数据源;2.执行中间操作;中间操作可以有多个,它们可以串连起来形成流水线;3.执行终端操作 执行终端操作后本次流结束,你将获得一个执行结果
Stream 接口:
List转Stream:
list.stream() // 转stream
// 并发处理
list.parallelStream()
filter(过滤)
Stream<T> filter(Predicate<? super T> predicate);
map(元素转换)
flatMap(元素转换)
distinct(去除重复,对象需要重写equals、hashCode)
Stream<T> distinct();
sorted(排序)
peek(生成新的流:流失单向的,例如用于日志打印)
limit(取前面n个元素)
skip(跳过n个元素)
forEach(遍历)
toArray(转换成数组)
reduce(结果归并)
count(计数)
long count()
///////////////////////////////////////////////////////////////////////////
Stream在使用之前,先要获取:数据源有多种形式:
1.集合:
Java7简化了IO操作,把打开IO操作放在try后的括号中即可省略关闭IO的代码
映射:
对流中的每个元素执行一个函数,使得元素转换成另一种类型输出,流会将每一个元素输送给map函数,并执行map中的lambda表达式,最后将执行结果存入到一个新的流中
归约:归约是将集合中的所有元素经过指定运算,折叠成一个元素输出,如:求最值、平均数等,这些操作都是将一个集合的元素折叠成一个元素输出,在流中,reduce函数能实现归约