您好,欢迎访问三七文档
java8新特性之函数式编程、lambda与stream简介目录CONTENTS1Java中的函数式编程思想2函数式接口3Lambda表达式4Stream-流5总结与讨论1Java中的函数式编程思想1Java中的函数式编程思想函数式编程是一种编程范式,它既是从特定角度去看待问题的一种思维框架,又是实现思维图景的配套工具。现代编程语言是多范式,支持多种多样的编程范式,如面向对象、函数式、过程式等等。什么是函数式编程1函数式编程允许将方法作为参数进行传递,突破了java语言只能进行值传递的限制,支持更高层次的抽象。函数式编程的意义21java中的函数式编程•函数式编程的核心是函数的传递,允许方法或者代码块作为参数进行传递。•函数式编程属于申明式编程,声明式编程的特点在于设计者制定规则并抛出需要调用者实现的目标,调用者决定如何实现这个目标,类似于模板方法设计模式。•函数式编程没有副作用。简单描述的意思是函数执行的过程不会对外部程序产生任何影响。函数式编程的特点行为传递行为抽象31java中的函数式编程函数式编程应用4函数式接口Lambda表达式Stream•函数式接口主要为行为提供单一抽象定义。•Lambda表达式提供承载函数的传递或实现。•Stream为集合操作提供函数式实现方式。2函数式接口2函数式接口1什么是函数式接口•函数式接口定义:•当接口里只有一个抽象方法的时候,就是函数式接口,可以使用注解(@FunctionalInterface)强制限定接口是函数式接口,即只能有一个抽象方法。2函数式接口2函数式接口•注意事项:•函数式接口里允许定义默认方法:函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,所以是符合函数式接口的定义的。•函数式接口里允许定义静态方法:函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的。•函数式接口里允许定义Java.lang.Object里的public方法:函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了Object类,包含了来自java.lang.Object里对这些抽象方法的实现。•函数式接口里允许子接口继承多个父接口,但每个父接口中都只能存在一个抽象方法,且必须是相同的抽象方法。2函数式接口2函数式接口2函数式接口的使用•函数式接口是一种声明式抽象定义,目前主要用于配合lambda表达式进行代码传递、以及构建类似于Stream的接口设计。2函数式接口3API中的函数式接口•为了帮助java用户更方便的使用新特性,java.util.function包中提供了常用函数式接口。•Predicate:接收一个泛型参数,返回一个布尔值•Consumer:接收一个泛型参数,没有返回值•Functoin:接收一个泛型参数,返回一个泛型参数PredicateConsumerFunction3Lambda表达式3Lambda表达式1了解Lambda表达式•定义:•Lambda是一种可传递匿名函数的方式,它没有名称,但他有参数列表、函数主体、返回类型,可能还有一个可以抛出异常的列表(不推荐抛出异常)。•特点:•lambda是方法的实现•lambda是延迟执行的•语法:•括弧包起来的参数•一个箭头•方法体,可以是单个语句,也可以是语句块3Lambda表达式2使用Lambda表达式1.配合函数式接口传递代码3Lambda表达式2.使用方法引用传递代码原理:•任何一个Lambda表达式都可以代表某个函数接口的唯一方法的匿名描述符。我们也可以使用某个类的某个具体方法来代表这个描述符,叫做方法引用。示例:•静态方法引用Integer::parseInt•实例方法引用System.out::print•构造器引用Person::new•变量对象方法引用变量名称:test方法名:mothed使用:test::mothed3Lambda表达式3Lambda的类型检查、参数类型推断以及限制类型检查:•当未给Lambda表达式指定所属函数式接口时,Lambda表达式的类型是由调用者的上下文决定的,即调用者定义的函数式接口类型。3Lambda表达式参数类型推断:•当编译器知道Lambda所属的函数接口以及上下文时,参数类型也就出来。3Lambda表达式限制:•Lambda可以使用参数列表之外的变量。•Lambda对实例变量的引用不受限制,对非实例变量的引用必须是final的(显式或隐式)。3Lambda表达式4Stream3Stream(流)1了解Stream什么是流:•Stream不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的Iterator。原始版本的Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母”等,Stream会隐式地在内部进行遍历,做出相应的数据转换。流的特点:•单向的、不可重复,数据只能遍历一次。•可以进行并行操作。(依赖fork/Join)•流的数据源本身可以是无线大小的。(stream的内容不会一次性加载到内存中)3Stream(流)2使用Stream初始/转换(init):Java中的Stream的所有操作都是针对流的,所以,使用Stream必须要得到Stream对象1、初始化一个流:Streamstream=Stream.of(a,b,c);2、数组转换为一个流:String[]strArray=newString[]{“a”,“b”,“c”};stream=Stream.of(strArray);或者stream=Arrays.stream(strArray);3、集合对象转换为一个流(Collections):ListStringlist=Arrays.asList(strArray);stream=list.stream();4、创建一个无限大小的数字流:IntStream.iterate(1,y-y+1);……流操作分为4大类:初始/转换(init)、媒介(Intermediate)、末端(Terminal)、短路(Short-circuiting)3Stream(流)媒介(Intermediate):对原始流的所有元素应用一些操作后会产生一个新的流,这种操作称为媒介操作,常见的媒介操作:•map:转换,对原始流元素进行加工转换为新的对象。•flatMap:合并,将底层元素向上提取。场景=原始流单个元素中包含多个结果。•Filter:过滤,满足条件的结果组成新的流。•Distinct:去重•Sorted:排序,可自定义排序规则。•Peek:遍历,peek后产生的流,与原始流元素相同。•Limit:截取,获取下标前面的元素。•Skip:截取,抛弃下标前面的元素。•Parallel:并行•Sequential:串行•Unordered:无序3Stream(流)末端(Terminal):对原始流的所有元素应用一些操作后可以得到一个结果(非stream),这种操作称为末端操作,常见的末端操作:•forEach•forEachOrdered•toArray•Reduce•Collect•Min•Max•Count•anyMatch•allMatch•noneMatch•findFirst•findAny•iterator3Stream(流)短路(Short-circuiting):对原始流元素应用一些操作后导致流提前终止,这种操作称为短路操作,常见的短路操作:•limit:截取•findAny:匹配获取满足条件的值•findFirst:匹配获取到第一个满足的就终止操作•noneMatch:没有一个元素符合•allMatch:全部符合•anyMatch:要有一个元素符合5总结回顾05总结回顾函数式编程函数式接口Lambda表达式StreamTHANKYOU!
本文标题:java8特性
链接地址:https://www.777doc.com/doc-5892513 .html