函数式编程

JDK8学习笔记-Function接口

陌路散爱 提交于 2020-04-09 11:11:21
学习JDK8新特性,必不可少的就是函数式编程,那也就不得不了解Function接口的使用了。 首先看下Function接口的定义 @FunctionalInterface public interface Function<T, R>{ /** * Applies this function to the given argument. * * @param t the function argument * @return the function result */ R apply(T t); // 省略其他方法 } 接口定义了两个泛型,在使用的时候需要指定。 该接口中比较重要的就是这个apply方法,其参数是类型T,返回时类型R(可能这么描述不太合适) 接下来看下Map中的新方法(该方法的详解可以参考我的另一篇博客 https://my.oschina.net/simpleton/blog/1552737 ) default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) { Objects.requireNonNull(mappingFunction); V v; if ((v = get(key)) == null) { V newValue; if ((newValue

java函数式编程Lambda基础 几Stream

匆匆过客 提交于 2020-04-05 20:42:25
java函数式编程Lambda基础 LambdaJava 8引入了Lambda语法,用以简化单抽象方法接口的实现 Lambda语法实现了类型自动推断 只定义了单个(只有一个抽象方法)抽象方法接口被称为函数式接口,标注为@FunctionalInterface 重写(继承的)的不算 方法引用 如果某个方法签名和接口方法恰好一致(参数类型和返回类型): 可以直接传入方法引用列: String::compareTo 引用静态方法(参数列表类型和返回类型一致) Arrays.sort(its, Comparator.comparingInt(o -> o)); 使用构造函数(构造参数和stream的泛型一致 并且 构造的类型是返回值的类型) String str = "hello,word,test,os,"; List<String> strList = Arrays.asList(str.split(",")); strList.stream().map(Student::new).collect(Collectors.toList()); stream 创建 String.of(1,2,3); Arrays.stream(list); list.stream(); map.stream() map 通过元数据应生成一个新的stream String str = "hello,word

函数语言

折月煮酒 提交于 2020-04-04 07:58:49
一、什么是函数式语言? 函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言。 函数式语言主要成分是原始函数、定义函数和函数型。这种语言具有较强的组织数据结构的能力,可以把某一数据结构(如数组)作为单一值处理;可以把函数作为参数,其结果也可为函数,这种定义的函数称为高阶函数,程序就是函数,程序作用在结构型数据上,产生结构型结果,从根本上改变了冯·诺伊曼式语言的“逐词”工作方式。 二、有哪些函数式语言? 1.lisp 2.common lisp ,Common lisp 是一个庞大的语言,支持多种编程范式,Common Lisp多用来写专家系统,也可以构造大型软件。 3.scheme,scheme是Common lisp的子集,由于语言核心很小,多用在教育领域。 4.Haskell ,Haskell是一种于1980年代末期所发布的函数式编程语言,Haskell函数式编程语言是在Miranda的基础上得到了,它对Miranda进行了标准化,所以这种语言集合了其他相关函数式编程开发的原理,它无需花费太多的赘述就能完成一些数据结构,比如链表和矩阵,是当前最广泛地被用于研究的一种函数式编程语言。 5.Clean ,它和Haskell有很多一样的地方。目前这门语言是用C写成的,由尼兹梅根大学负责维护。 6.Meta Language

函数式编程的杂七杂八(非常乱)

蓝咒 提交于 2020-03-30 05:42:09
1.把大象关进冰箱里问题 面向过程: 把大象关进冰箱里: 把冰箱门打开=> 大象放冰箱里=> 冰箱门关上 面向对象: 冰箱.开门() 冰箱.放入(大象) 冰箱.关门() 函数式: 关进(冰箱,大象): 关门(放入(开门(冰箱),大象)) —————————————————————————— 2. C#引入FP的特性被某些人称作语法糖,我一直有意把这种观点拖出来痛打一顿(注意不是把持有这种观点的人拖出来痛打),至于持有这种观点的人,我禁止你们写a+b*c,以后给我统统去写汇编 MOV EAX, [b] MUL EAX, [c] ADD EAX, [a] 当然前提是我能禁止得了。 —————————————————————————— 3.语言特性和编程范式完全是两码事 从某种程度上来说,C语言既能进行函数式编程,又能进行 在支持面向对象的语言里,我完全可以设计一个类似下面的类 class Search { virtual List Extend(Node node) virtual bool Beam(Node node) virtual bool CheckFinish(Node node) Node Search() { OrderedCollection openlist=new OrderedCollection(); openlist.put(node); while(

拿 C# 搞函数式编程 - 3

雨燕双飞 提交于 2020-03-29 02:30:09
前言 今天和某个人聊天聊到了 C# 的 LINQ,发现我认识的 LINQ 似乎和大多数人认识的 LINQ 不太一样,怎么个不一样法呢?其实 LINQ 也可以用来搞函数式编程。 当然,并不是说写几个 lambda 和用用像 Java 那样的 stream 之类的就算叫做 LINQ 了,LINQ 其实是一个另外的一些东西。 LINQ 在 C# 中,相信大家都见过如下的 LINQ 写法: IEnumerable<int> EvenNumberFilter(IEnumerable<int> list) { return from c in list where c & 1 == 0 select c; } 以上代码借助 LINQ 的语法实现了对一个列表中的偶数的筛选。 LINQ 只是一个用于方便对集合进行操作的工具而已,如果我们如果想让我们自己的类型支持 LINQ 语法,那么我们需要让我们的类型实现 IEnumerable<T> ,然后就可以这么用了。。。 哦,原来是这样的吗?那我全都懂了。。。。。。 ???哦,我的老天,当然不是! 其实 LINQ 和 IEnumerable<T> 完全没有关系!LINQ 只是一组扩展方法而已,它主要由以下方法组成: 方法名称 方法说明 Where 数据筛选 Select/SelectMany 数据投影 Join/GroupJoin 数据联接

Python3模糊点整理-函数式编程-高阶函数

我是研究僧i 提交于 2020-03-27 13:26:18
高阶函数 变量指向函数,有点像起别名 >>> f = abs >>> f(-10) 10   函数也是变量名 >>> abs = 10 >>> abs(-10) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not callable #实际代码绝对不能这么写,这里是为了说明函数名也是变量。要恢复abs函数,请重启Python交互环境。   接收函数做参数-->高阶函数 def add(x, y, f): return f(x) + f(y) #当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函数定义,我们可以推导计算过程为: x = -5 y = 6 f = abs f(x) + f(y) ==> abs(-5) + abs(6) ==> 11 return 11 有趣的高阶函数map:函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回     >>> def f(x): ... return x * x ... >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) >>>

Python 函数

点点圈 提交于 2020-03-19 02:57:52
一、函数是什么?   函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。   函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。 定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。 特性: 代码重用 保持一致性 可扩展性 二、函数的创建 2.1 格式: Python 定义函数使用 def 关键字,一般格式如下: def 函数名(参数列表): 函数体 def hello(): print('hello') hello()#调用 2.2 函数名的命名规则 : 函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标点符号; 函数名是区分大小写的。 函数名不能是保留字。 2.3 形参和实参 形参:形式参数,不是实际存在,是虚拟变量。在定义函数和函数体的时候使用形参,目的是在函数调用时接收实参(实参个数,类型应与实参一一对应) 实参:实际参数

什么是函数式编程?

♀尐吖头ヾ 提交于 2020-03-15 06:36:09
Wikipedia 对函数式编程的定义是: Functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data. It emphasizes the application of functions, in contrast to the imperative programming style, which emphasizes changes in state. 函数式编程是一种编程范式,在这种编程方式中,我们更多的使用函数运算。函数运算的特点是没有状态和可变量,一个函数有输入值和输出值,运算一个函数不会产生任何副作用(side effect)。 与之相对的是Imperative Programming, 就是我们通常说的命令式编程。一般我们的编程方式都是命令式的,每一段程序都是指令,明确告诉计算机要做什么,运行指令的结果往往是程序状态(state)的改变。 一个例子最好说明两者的区别。让我们来打印八卦的符号。对程序员来说,这是一个很简单的作业。典型的程序会是这样的: let yinyang = ['¦';'|'] for x in yinyang

Python学习笔记07_函数式编程

孤人 提交于 2020-03-08 16:40:15
高阶函数Higher-order function 变量可以指向函数,即:函数本身也可以赋值给变量。 函数名也是变量。 把函数作为参数传入,这样的函数称为高阶函数。 map/reduce map()函数,接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。 <<< def f(x): return x * x <<< r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) <<< list(r) [1, 4, 9, 16, 25, 36, 49, 64, 81] # map()传入的第一个参数是f,即函数对象本身。 # 由于结果r是一个Iterator,Iterator是惰性序列, # 因此通过list()函数把整个序列计算出来并返回一个list. reduce()函数。 reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) # f是两个参数 reduce(f, [x1, x2, x3, x4]) = f(f(f(f(x1), x2), x3), x4) # f是一个参数 # str转换为int的函数 from functools import reduce def str2int(s): def fn(x, y):

Java8新特性

随声附和 提交于 2020-03-07 00:17:47
Java8新特性:函数式编程lambda,流stream,日期,optional,collector,completableFuture java命令:jstat -gcutil 进程ID(通过jps命令查看) 多少毫秒 多少次 注意:java8已经把持久代 persistent 去掉了,换成元数据空间metedata space java8 - 函数式编程lambda 满足lambda表达式的条件: 1、接口有且只有一个方法。 可以存在default、static 方法,可以查看jdk的 Comparator 类,该类存在default、static方法 2、 可以使用@FunctionalInterface 注解修饰。表示该接口是一个函数式接口。 来源: oschina 链接: https://my.oschina.net/u/3901188/blog/3189393