文档章节

函数式编程介绍

Crazy_Coder
 Crazy_Coder
发布于 2017/05/23 16:14
字数 684
阅读 15
收藏 1
点赞 0
评论 0

##什么是函数式编程 函数式编程是种编程典范,它将电脑运算视为函数的计算。函数编程语言最重要的基础是 λ 演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。和过程化编程相比,函数式编程里,函数的计算可随时调用。

##Guava中的函数式编程 为了支持函数式编程,Guava提供了下面这两个接口:

public interface Function<F, T> {
    @Nullable T apply(@Nullable F input);
}
public interface Predicate<T> {
    boolean apply(@Nullable T input);
}

举个例子:在一群People对象中,找到年龄大于20的People

  • 通常做法:
List<Person> oldPeople = new ArrayList<Person>(); 
for (Person person : people) { 
    if (person.getAge() >= 20) { 
        oldPeople.add(person); 
    }
}
  • 在Guava中提供了filter模式,filter即从一个集合中根据一个条件筛选元素。
    • 找出age大于20的
    List<Person> oldPeople = Lists.newArrayList(Collections2.filter(people, new Predicate<Person>() { 
        public boolean apply(Person person) { 
            return person.getAge() >= 20; 
        } 
    }));
    
    • 找出name中含有字符w的
    List<Person> oldPeople = Lists.newArrayList(Collections2.filter(people, new Predicate<Person>() { 
        public boolean apply(Person person) { 
            return person.getName().contains("w");
        } 
    }));
    
    • 找出age>20并且name中含有字符w的人
    // 一般大家都会这么写,当然这种写法是可以的
    List<Person> oldPersons = Lists.newArrayList(Collections2.filter(persons, new Predicate<Person>() {
        public boolean apply(Person person) {
            return person.getAge() >= 20 && person.getName().contains("w");
        }
    }));
    

这样写的话就有一定的代码重复,因为之前我们已经写了两个Predicate来分别实现这两个条件判断,能不能重用之前的Predicate那?答案是能。 我们首先将之前生成年龄判断和名称判断的两个Predicate抽成方法。 java private Predicate<Person> ageBiggerThan(final int age) { return new Predicate<Person>() { public boolean apply(Person person) { return person.getAge() >= age; } }; } private Predicate<Person> nameContains(final String str) { return new Predicate<Person>() { public boolean apply(Person person) { return person.getName().contains(str); } }; } //而我们的结果其实就是这两个Predicate相与。Guava给我们提供了and方法,用于对一组Predicate求与。 List<Person> filteredPeople = Lists.newArrayList(Collections2.filter(people, Predicates.and(ageBiggerThan(20), nameContains("w"))));

##JDK8中的函数式编程 在上面的例子中:

  • 在一群People对象中,找到年龄大于20的People
List<Person> filteredPeople = persons.stream().filter(p -> p.getAge() >= 20).collect(Collectors.toList());  
  • 找出name中含有字符w的
List<Person> filteredPeople = persons.stream().filter(p -> p.getName().contains("w")).collect(Collectors.toList());  

##总结

  1. 无法升级jdk版本的项目,推荐使用guava

    guava作为jdk8最好的替代品,是值得使用的

  2. 可以平稳升级jdk的项目,推荐使用jdk8

    jdk8天生的优势,注定它优于guava,再加上后来引入的lambda表达式,使jdk8的语法更加优美

  3. jdk8出生于guava之后,所以说,jdk8很多地方都是借鉴于guava

© 著作权归作者所有

共有 人打赏支持
Crazy_Coder

Crazy_Coder

粉丝 143
博文 23
码字总数 22794
作品 5
南京
程序员
《RxJava 2.x 实战》

我最近写了一本书《RxJava 2.x 实战》。 该书由电子工业出版社出版,目前已经在淘宝、京东、当当、亚马逊等各大电商平台上进行销售或预售。 天猫电子工业出版社旗舰店 https://detail.tmall...

fengzhizi715
04/28
0
0
Cats(一):从函数式编程思维谈起

本文由 Yison 发表在 ScalaCool 团队博客。 Cats logo 如果你看到一个开源类库,logo 是四只猫 + 五个箭头,可能会略感不适 — 这是工程代码里可以使用的玩意儿吗? 没错,这是 TypeLevel 设...

ScalaCool
2017/11/30
0
0
函数式编程基础思想

说明 网上有很多深入语言层次讲解函数式编程的应用,很多人无法理解,能用但是一头雾水,死记硬背,原因究其是核心思想不清楚。 我说的语言层次上的,例如 Spark MapReduce lambda Groovy Rx...

热血沸腾
2017/12/20
0
0
[Swift]以函数式编程的方式使用字符串中的Ranges

原文:Swift: Using String Ranges The Functional Way 几周之前,我介绍了『Swift中如何使用Range截取字符串』。那时,Swift中使用Range为什么如此艰难让人疑惑不解,但是至少我们找到一种可...

Redding
2014/12/18
0
0
iOS 中的链式编程、函数式编程入门

对一个程序猿来说,从一开始接触编程后会逐渐经历好几个不同的编程思想。包括过程式编程、面向对象编程、响应式编程、函数式编程、链式编程等等。 的特点是随着程序的编写逐步进行,写到哪儿...

BennyLoo
2017/11/08
0
0
匿名函数与lambda

lambda函数介绍 python允许使用lambda关键字来创造匿名函数,lambda是一个表达式,也可以说是一个匿名函数。 lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。包含...

Gaterny
01/11
0
0
了解JavaScript函数式编程(一)

JavaScript 作为一种典型的多范式编程语言,这两年随着React的火热,函数式编程的概念也开始流行起来,RxJS、cycleJS、lodashJS、underscoreJS等多种开源库都使用了函数式的特性。所以下面介...

WolfX
2016/09/09
16
0
七周七并发模型

image.png 七个模型来介绍并发与并行。 线程与锁:线程与锁模型有很多众所周知的不足,但仍是其他模型的技术基础,也是很多并 发软件开发的首选。 函数式编程:函数式编程日渐重要的原因之一,...

高广超
01/01
0
0
程序猿DD给大家送书啦!连送三天!每天不同!

本次送书活动连续三天,每天不一样,点击“关注”及时参与!!! 今天是本次元旦假期的第一天,感谢小伙伴们一直以来对我的支持 有了你们的支持,才让我能够一直坚持到现在 同时,也让我看到...

j3t9z7h
2017/12/30
0
0
.NET架构师:函数式语言做领域驱动设计

  【IT168 评论】在领域驱动设计(DDD)中使用函数式语言,在跟业务专家探讨时,真正的代码经常简单得足以取代各种UML图,Scott Wlaschin在最近的函数式伦敦群组集会上讲到了一个用F#做业务建...

infoQ
2014/03/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CoreText进阶(七)-添加自定义View和对其

CoreText进阶(七)-添加自定义View和对其 其它文章: CoreText 入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更多...

aron1992
13分钟前
0
0
Python爬虫 爬取百合网的女人们和男人们

学Python也有段时间了,目前学到了Python的类。个人感觉Python的类不应称之为类,而应称之为数据类型,只是数据类型而已!只是数据类型而已!只是数据类型而已!重要的事情说三篇。 据书上说...

p柯西
24分钟前
0
0
在Java中,你真的会日期转换吗

1.什么是SimpleDateFormat 在java doc对SimpleDateFormat的解释如下: SimpleDateFormatis a concrete class for formatting and parsing dates in a locale-sensitive manner. It allows fo......

Java小铺
33分钟前
0
0
Linux系统梳理---系统搭建(二):tomcat的安装和使用

上一章讲到JDK的安装使用,这一章主要记录下服务器tomcat的安装以及部署一个项目. 1.下载tomcat,这里下载的是apache-tomcat-8.5.32.tar.gz 2.创建文件夹,便于管理,和JDK一样,在usr目录下创建t...

勤奋的蚂蚁
44分钟前
0
0
ES15-聚合

1.Terms Aggregation 分组聚合 2.Filter Aggregation 过滤聚合

贾峰uk
45分钟前
0
0
【2018.07.19学习笔记】【linux高级知识 20.27-20.30】

20.27 分发系统介绍 20.28 expect脚本远程登录 20.29 expect脚本远程执行命令 20.30 expect脚本传递参数

lgsxp
47分钟前
0
0
10.32/10.33 rsync通过服务同步~10.35 screen工具

通过服务的方式同步要编辑配置文件:[root@linux-xl ~]# vim /etc/rsyncd.confport=873log file=/var/log/rsync.logpid file=/var/run/rsyncd.pidaddress=192.168.43.21[tes...

洗香香
51分钟前
0
0
与女儿谈商业模式 (3):沃尔玛的成功模式

分类:与女儿谈商业模式 | 标签: 经济学 沃尔玛 陈志武 2007-05-10 09:09阅读(11279)评论(30) 与女儿谈商业模式 (3):沃尔玛的成功模式 陈志武 /文 沃尔玛(Wal-Mart)是另一个有意思的财...

祖冲之
57分钟前
0
0
网页加载速度优化方法总结

1、减少请求 最大的性能漏洞就是一个页面需要发起几十个网络请求来获取诸如样式表、脚本或者图片这样的资源,这个在相对低带宽和高延迟的移动设备连接上来说影响更严重。 2、整合资源 对开发...

Jack088
今天
0
0
dubbo学习

https://blog.csdn.net/houshaolin/article/details/76408399

喵五郎
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部