摘要:所以通过上面的例子可以看出函数式编程和结合的非常紧密。小结本篇简单介绍了函数式编程与应用及类方法引用的使用,表达式让老版本的代码更简洁,方法引用让表达式更简洁,实际上就是表达式的一种语法糖。
上一篇文章中,我们介绍了几个Java8内置的函数式接口的特点和使用方式,并在最后引出了stream api的知识点,接下来我们开始学习Java8中的stream api。
先假设一个简单的需求,存在一个字符串集合,我们想把所有长度大于5的字符串转换成大写输出到控制台,之前我们可能会直接这么做
public class Test3 { public static void main(String[] args) { Listlist = Arrays.asList("hello","world","helloworld"); for (int i = 0; i < list.size(); i++) { if(list.get(i).length() > 5){ System.out.println(list.get(i).toUpperCase()); } } } }
现在换成使用stream api看下
public class Test3 { public static void main(String[] args) { Listlist = Arrays.asList("hello","world","helloworld"); list.stream().filter(s -> s.length() > 5).map(s -> s.toUpperCase()).forEach(System.out::println); } }
1行代码直接搞定,而且这种链式编程风格从语义上看逻辑很清晰。
stream方法先构造了一个该集合的Stream对象,filter方法取出长度大于5的字符串,map方法将所有字符串转大写,forEach输出到控制台。我们可以对照Stream接口的源码片段看下这几个stream api的定义
public interface Streamextends BaseStream > { Stream filter(Predicate super T> predicate); Stream map(Function super T, ? extends R> mapper); void forEach(Consumer super T> action); . .省略 . }
filter方法,接收一个Predicate函数式接口类型作为参数,并返回一个Stream对象,从上一篇我们知道可以由一个接收一个参数返回布尔类型的lambda表达式来创建Predicate函数式接口实例,所以看到filter接收的参数是s -> s.length() > 5
map方法,接收Function函数式接口类型,接收一个参数,有返回值s -> s.toUpperCase() 正是做了这件事情
forEach方法,接收Consumer函数式接口类型,接收一个参数,不返回值 这里使用方法引用的其中一种形式System.out::println来创建了Consumer实例。
所以通过上面的例子可以看出函数式编程和stream api结合的非常紧密。大家应该也注意到了在介绍每个方法时,我们提到了有中间操作和终止操作,终止操作意味着我们需要一个结果了,当程序遇到终止操作时才会真正执行。中间操作是指在终止操作之前所有的方法,这些方法以方法链的形式组织在一起处理一些列逻辑,如果只有中间操作而没有终止操作的话即使运行程序,代码也不会执行的。
实际上map方法中可以使用另一种方法引用的形式来处理,类方法引用。语法:类名::方法名
public class Test3 { public static void main(String[] args) { Listlist = Arrays.asList("hello","world","helloworld"); list.stream().filter(s -> s.length() > 5).map(String::toUpperCase).forEach(System.out::println); } }
之前介绍的System.out::println这种属于对象方法引用,类方法引用的应用也是很广泛的。只是理解起来需要花费些时间,map方法接收一个Function函数式接口的实现,那就肯定需要一个输入并且有一个输出,但是我们看下toUpperCase方法的定义
public String toUpperCase() { return toUpperCase(Locale.getDefault()); }
有返回值,但是没有入参,乍一看也不符合Function接口中apply方法的定义啊。这也是类方法引用的特点,虽然toUpperCase没有明确的入参,因为此时toUpperCase的输入是调用它的那个对象,编译器会把调用toUpperCase方法的那个对象当做参数,也就是lambda表达式s -> s.toUpperCase()中的s参数。所以也满足一个输入一个输出的定义。
小结:本篇简单介绍了函数式编程与stream api应用及类方法引用的使用,lambda表达式让老版本的代码更简洁,方法引用让lambda表达式更简洁,实际上就是lambda表达式的一种语法糖。
下一篇
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70674.html
摘要:仅在几年以前,仅有少数的程序员知道函数式编程是什么。函数式编程是声明性的而不是命令式的应用状态流经纯函数中。函数式编程是一种编程模式。在理解软件是如何使用函数式编程构建时,理解函数组合是非常重要的一步。不可变性是函数式编程的核心概念。 函数式编程已然变成了一个javascript语言中一个非常热门的话题。仅在几年以前,仅有少数的js程序员知道函数式编程是什么。但是在过去三年中,我所见过...
摘要:函数式编程概述如今主流的编程语言,函数式编程范式或多或少都融入其中成了标配,或者说主流语言都在进行函数式方面的扩充,这是一个大趋势。 showImg(https://segmentfault.com/img/remote/1460000015089083); 函数式编程概述 如今主流的编程语言,函数式编程范式或多或少都融入其中成了标配,或者说主流语言都在进行函数式方面的扩充,这是一...
摘要:但是,对函数式编程而言,这个行为的重要性是毋庸置疑的。关于该模式更正式的说法是偏函数严格来讲是一个减少函数参数个数的过程这里的参数个数指的是希望传入的形参的数量。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实的梁柱;分享,是...
摘要:我们将使用,这是一个现代,简单,漂亮的框架,在内部使用并将响应式编程概念应用于前端编程。驱动程序采用从我们的应用程序发出数据的,它们返回另一个导致副作用的。我们将使用来呈现我们的应用程序。仅采用长度超过两个字符的文本。 Rxjs 响应式编程-第一章:响应式Rxjs 响应式编程-第二章:序列的深入研究Rxjs 响应式编程-第三章: 构建并发程序Rxjs 响应式编程-第四章 构建完整的We...
阅读 1671·2021-11-11 10:58
阅读 4127·2021-09-09 09:33
阅读 1234·2021-08-18 10:23
阅读 1526·2019-08-30 15:52
阅读 1600·2019-08-30 11:06
阅读 1830·2019-08-29 14:03
阅读 1475·2019-08-26 14:06
阅读 2870·2019-08-26 10:39