供应信息

函数式编程入门

时间:2021/1/6 15:05:01  作者:  来源:  查看:12  评论:0
内容摘要:1.概述1.1 函数式编程简介Java作为面向对象的编程语言,如果依照编程品种划分属于命令式编程(Imperative Programming)。常见的编程范式还有逻辑式编程(Logic Programming),函数式编程(Functional Programming)。函数式...

1.概述

1.1 函数式编程简介

Java作为面向对象的编程语言,如果依照编程品种划分属于命令式编程(Imperative Programming)。常见的编程范式还有逻辑式编程(Logic Programming),函数式编程(Functional Programming)。

函数式编程作为一种编程范式,在迷信范畴,是一种编写盘算机程序数据构造跟元素的方法,它把计算进程当做是数学函数的求值,而防止更改状况和可变数据。

什么是函数式编程?简单的答复:所有都是数学函数。函数式编程语言里也可以有对象,但通常这些对象都是恒定不变的 —— 要么是函数参数,要什么是函数返回值。函数式编程语言里没有 for/next 循环,由于这些逻辑象征着有状态的转变。相替换的是,这种循环逻辑在函数式编程语言里是通过递归、把函数当成参数传递的方式实现的。

2. Lambda 表达式

Java 8的最大变更是引入了Lambda(Lambda 是希腊字母 λ 的英文名称)表达式——一种紧凑的、传递行动的方式。

2.1 Lambda 表白式的情势

lambda表达式的语法由参数列表、箭头符号->和函数体组成。函数体既可以是一个表达式,也可以是一个语句块。

表达式:表达式会被执行然后返回履行结果。

语句块:语句块中的语句会被顺次执行,就像方法中的语句一样。

return语句会把把持权交给匿名方式的调用者。

break和continue只能在轮回中使用。

假如函数体有返回值,那么函数体内部的每一条门路都必需返回值。

表达式函数体合适小型lambda表达式,它打消了return要害字,使得语法更加简练。

下面是一些lambda表达式:

(int x, int y) ‐> x + y

() ‐> 42

(String s) ‐> { System.out.println(s); }

第一个lambda表达式吸收 x 和 y 这两个整形参数并返回它们的和;第二个lambda表达式不接收参数,返回整数'42';第三个lambda表达式接受一个字符串并把它打印到节制台,不返回值。

2.2 常见利用

2.2.1 替代匿名内部类

毫无疑难,lambda表达式用得最多的场所就是替代匿名内部类,而实现Runnable接口是匿名内部类的经典例子。lambda表达式的功效相称壮大,用()->就可以取代全部匿名内部类!请看代码:

如果使用匿名内部类:

@Test

public void oldRunable() {

new Thread(new Runnable() {

@Override

public void run() {

System.out.println("The old runable now is using!");

}

}).start();

}

而如果使用lambda表达式:

@Test

public void runable() {

new Thread(() ‐> System.out.println("It's a lambda function!")).start();

}

最后的输出:

The old runable now is using!

It's a lambda function!

是不是强盛到可怕?是不是简略到可怕?是不是清楚明了重点凸起到可怕?这就是lambda表达式的恐怖之处,用极少的代码实现了之前一个类做的事件!

2.2.2 应用lambda表达式对聚集进行迭代

Java的集合类是日常开发中常常用到的,甚至说不哪个java代码中没有使用到集合类。。。而对集合类最常见的操作就是进行迭代遍历了。请看对照:

@Test

public void iterTest() {

List<String> languages = Arrays.asList("java","scala","python"); //before java8

for(String each:languages) {

System.out.println(each);

}

//after java8

languages.forEach(x ‐> System.out.println(x)); languages.forEach(System.out::println);

}

如果熟习scala的同窗,肯定对forEach不生疏。它可以迭代集合中所有的对象,并且将lambda表达式带入其中。

languages.forEach(System.out::println);

这一行看起来有点像c++里面作用域解析的写法,在这里也是可以的。

2.2.3 用lambda表达式实现map

一提到函数式编程,一提到lambda表达式,怎么能不提map。没错,java8确定也是支撑的。请看示例代码:

@Test

public void mapTest() {

List<Double> cost = Arrays.asList(10.0, 20.0,30.0); cost.stream().map(x ‐> x + x*0.05).forEach(x ‐>

System.out.println(x));

}

最后的输出结果:

10.5

21.0

31,JS代码压缩是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格.5

map函数能够说是函数式编程里最主要的一个方法了。map的作用是将一个对象变换为另外一个。在咱们的例子中,就是通过map办法将cost增添了0.05倍的大小而后输出。

2.2.4 用lambda抒发式实现map与reduce

既然提到了map,又怎能不提到reduce。reduce与map一样,也是函数式编程里最重要的多少个方法之一。map的作用是将一个对象变为另外一个,而reduce实现的则是将所有值合并为一个,请看:

@Test

public void mapReduceTest() {

List<Double> cost = Arrays.asList(10.0, 20.0,30.0);

double allCost = cost.stream().map(x ‐> x+x*0.05).reduce((sum,x) ‐> sum + x).get();

System.out.println(allCost);

}

终极的成果为:

63.0

如果我们用for循环来做这件事情:

@Test

public void sumTest() {

List<Double> cost = Arrays.asList(10.0, 20.0,30.0); double sum = 0;

for(double each:cost) {

each += each * 0.05;

sum += each;

}

System.out.println(sum),JSON格式化是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率;

}

信任用map+reduce+lambda表达式的写法高出不止一个level。

2.2.5 filter操作

filter也是我们时常使用的一个操作。在操作集合的时候,常常须要从原始的集合中过滤掉一局部元素。

@Test

public void filterTest() {

List<Double> cost = Arrays.asList(10.0, 20.0,30.0,40.0); List<Double> filteredCost = cost.stream().filter(x ‐> x >

25.0).collect(Collectors.toList());

filteredCost,不可逆JS加密随着互联网的快速发展,网站客户端(浏览器)IE(ff)运行的javaSCRIPT代码常常被别人轻易的拷贝, 为了保护程序员自己的劳动成果,因此程序员不得不对想办法保护自己源代码-------javascript加密.forEach(x ‐> System.out.println(x));

}

最后的结果:

30.0

40.0

真空阀、破真空阀、气动真空阀、电磁真空阀、中国真空阀网
客服工作时间:周一至周六 08:30~17:30 工作时间有问题直接致电客服
本网站各种信息和各种专题专栏资料, 均为中国真空阀网版权所有,未经协议授权,禁止下载使用!违者必究
主办单位:中国真空阀协会 Copyright © 2004-2012 www.hnebptw.com
鲁ICP备08237667号-2
如果本网站有内容侵犯了您的权益请告知我们,我们将第一时间删除并向您道歉