博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数式编程介绍
阅读量:6288 次
发布时间:2019-06-22

本文共 2548 字,大约阅读时间需要 8 分钟。

hot3.png

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

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

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

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

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

转载于:https://my.oschina.net/sunhaojava/blog/907490

你可能感兴趣的文章
java国际化(转)
查看>>
Netty
查看>>
StringBuilder与StringBuffer的区别(转)
查看>>
「陶哲軒實分析」 習題 3.5.11 註記 由冪集公理的兩種等價表述而想到的函數的定義問題...
查看>>
使用Asymptote的循环功能画出绿叶阵
查看>>
域上多项式的带余除法
查看>>
EM算法
查看>>
C#高级编程(第七版)读书笔记(1)——字符类型
查看>>
js sort()
查看>>
Java环境变量从jdk1.7修改为1.8
查看>>
二分查找/暴力 Codeforces Round #166 (Div. 2) B. Prime Matrix
查看>>
vue项目启动需安装?
查看>>
dedecms 系统的 data/rssmap.html不存在!更新了也没有。。。
查看>>
理解RESTful架构
查看>>
Zookeeper02
查看>>
ASP.NET编译执行常见错误及解决方法汇总之五(终结篇)
查看>>
编译器的工作过程
查看>>
Oracle 12C 新特性之表分区或子分区的在线迁移
查看>>
Centos 安装ixgbe驱动
查看>>
【BZOJ2589】 Spoj 10707 Count on a tree II
查看>>