JAVA8的新特性学习笔记-(lambda、stream)
2015-12-13 14:23
816 查看
看了网上的一些博客,总结如下:
数据源.parallelStream()/Stream()返回并行/串 ,然后通过流 方法 传入lambda,实现某些功能。。。最常用数据源是 集合
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); );
相关文章推荐
- java IO流学习总结
- 工厂模式
- eclipse机器硬重启后package和project视图中看不见工作区间中的工程
- 【深入】java 单例模式
- Java虚拟机(一)内存管理子系统
- java多线程,多个客户端之间发送文件
- JAVA读取TXT文本中的数据
- struts2重要知识点总结(2)
- JAVA-建造者设计模式
- 分享java中设置代理的两种方式
- Java Multi-Threading
- 8张图理解Java
- java:IO流学习小结
- JAVA-单例模式的七种写法
- Java工程师成神之路~
- java float小数相减不准确
- java 中的原始类型与原始封装类型
- spring4.0 源码分析 DefaultListableBeanFactory和XmlBeanDefinitionReader(二)
- JAVA-模板设计模式
- Intellij idea搭建maven+springMVC开发项目(一)