您的位置:首页 > 编程语言 > Java开发

JAVA8的新特性学习笔记-(lambda、stream)

2015-12-13 14:23 816 查看
看了网上的一些博客,总结如下:

lambda函数:

java中的lambda,需要先定义一个 只有一个抽象方法的接口,称为SAM类型,

@FunctionalInterface    //SAM接口注解
interface SAM{
public int F(int x);     //只能有一个抽象函数
default int G(int x){    //java8中,可以有默认实现函数
return -1;
}
}
SAM sam = (params)->{ body; };   //实现 SAM.F()方法,返回一个接口实现后的对象

//1.抽象方法F只有一个参数,则()可省略,params参数类型可省略
//2.若返回值为void且只有一条语句时,{}可省略
//3.若抽象方法 F体内 需要使用局部变量(直接使用),则参数一定是隐式final的,不可二次赋值(全局的类变量没有这个限制)
//4.默认情况下,Lambda表达式不能序列化,引入"类型关联" lambda & ZAM,相当于实现了ZAM接口,ZAM(zero abstract method)

//5.若抽象方法F(args)的实现代码 仅是 调用另一个方法G(args),且F(agrs)的参数和G(args)的参数一样,那么可直接用G代替lambda表达式,G叫做方法引用
F(String s){
System.out.println(s);
}
//等同于:(s)->System.out.println(s);
System.out::println     //代表println参数为s,注意作用域符::

//6.lambda方法,字节码下方法名是: Lambda$0


JAVA定义的SAM接口

由于Java中很多

Function:R apply(T t) ;     //对传入的 类型为T的参数t,操作后 返回一个类型为R的值
Consumer:void accept(T t) ; //对传入的参数t,执行操作
Predicate:boolean test(T t) ; //对传入的参数t,判断是否满足条件
Supplier:T get()  ;         //新建一个元素,返回


Stream

Stream<T> :批量流处理,处理过程中不会改动源数据,

数据源.parallelStream()/Stream()返回并行/串 ,然后通过流 方法 传入lambda,实现某些功能。。。最常用数据源是 集合

//以List为例
Stream<String> listStream = l.stream();     //串行,按顺序一个一个处理
Stream<String> listStream = l.parallelStream(); //并行,分段多线程处理

//stram的常用方法:

//第一类:返回处理后的流
forEach(Consumer)   //
filter(Predicate)   //排除所有不满足条件的元素
map(Function)       //执行元素的映射转换,接收一种类型T,然后转化为另一种类型R返回
peek(Consumer)      //对遇到的每个流元素执行一些操作。
distinct()          //去重。根据流元素的equals(..)结果排除所有重复的元素
sorted(Comparator)  //使后续操作中的流元素强制按Comparator定义的比较逻辑排列。
limit(maxSize)  //使后续操作只能看到 maxSize数量的元素。
parallel();     //返回流的并行形式
substream() 使后续操作只能看到某个范围内的元素(使用索引)。

//第二类:根据流返回结果,通过这些操作后,stream就失效了

//BinaryOperator继承BiFunction : R apply(T t, U u)
//identify初始值    ,
//accumultor累加器 R apply(T t, U u); //线程对流的两个元素操作返回结果
//combiner, R apply(T t, U u);//并行情况下,为了避免竞争,每个线程都会有独立的result,combiner就是把中间结果结合起来
reduce(identity,BiFunction accumulator,BinaryOperator<U> combiner)

reduce( i,
(x,y)->{return x+y;},
(left,right)->{return left-right;} );

//supplier:     T get();    //用来生成一个新的结果容器
//accumulator:  void accept(T t, U u);   //线程对流的两个元素操作返回结果
//combiner:     void accept(T t, U u);  并行情况下

collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner)

collect(  ()->new ArrayList<Integer>(),
(list,item)->list.add(item+1),
(list1,list2)->{
list1.add(0);
);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: