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函数能实现归约

 

版权声明:本文为zhangshitong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhangshitong/p/13601406.html