什么是函数式编程

  1. 基本概念:他是一种编程范式,对于函数式编程来说,它只关心定义输入数据和输出数据相关的关系,数学表达式里面其实是在做一种映射(mapping),输入的数据和输出的数据关系是什么样的,是用函数来定义的。
  2. 特征:
    • stateless:函数不维护任何状态。函数式编程的核心精神是 stateless,简而言之就是它不能存在状态,打个比方,你给我数据我处理完扔出来。里面的数据是不变的。
    • immutable:输入数据是不能动的,动了输入数据就有危险,所以要返回新的数据集。(不可变的)

Java为什么要函数式编程

  1. 优势

    • 没有状态就没有伤害。
    • 并行执行无伤害。
    • Copy-Paste 重构代码无伤害。
    • 函数的执行没有顺序上的问题。

问题所在

  • 函数式相对于普通的java变成来说,如果没有用过就会直接不清楚这个函数是干什么的,这个是干什么的,如果在团队中只有部分人使用,那我们在其他人在理解我们的代码上就会有问题,也就回增加学习成本,和开发成本。
  • 使用的问题:问题排查的问题 和异常的捕获的问题。

EXAMPLE

package Vavr;import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.sun.istack.internal.FragmentContentHandler;
import io.vavr.CheckedFunction0;
import io.vavr.Function1;
import io.vavr.Function2;
import io.vavr.Function3;
import io.vavr.Lazy;
import io.vavr.Tuple;
import io.vavr.Tuple2;
import io.vavr.control.Either;
import io.vavr.control.Option;
import io.vavr.control.Try;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ThreadLocalRandom;
import javax.annotation.Generated;
import lombok.Getter;/*** 函数式编程demo** @author yuanxindong* @date 4/17/21  7:30 PM*/
public class VavrTest {/*** 元组的使用*/public static void tupleTest() {//of 静态方法支持使用Tuple2<String, Integer> tuple2 = Tuple.of("Hello", 100);Tuple2<String, Integer> updatedTuple2 = tuple2.map(String::toUpperCase, v -> v * 5);String result = updatedTuple2.apply((str, number) -> String.join(", ",str, number.toString()));System.out.println(result);}/*** function函数的使用*/public static void functionTest() {// 函数定义,前3个是入参,最后是RFunction3<Integer, Integer, Integer, Integer> function3 = (v1, v2, v3) -> (v1 + v2) * v3;// 函数的组合Function3<Integer, Integer, Integer, Integer> composed =function3.andThen(v -> v * 100);//执行结果int result = composed.apply(1, 2, 3);System.out.println(result);//还有包含部分函数的应用Function1<Integer, Integer> function1 = function3.apply(1, 2);Integer apply = function1.apply(1);System.out.println(apply);//项目联想//结合项目场景使用比如说PDT中定义几个 函数比如:计算MP时效的函数,计算ALG的函数时效,在定义一些函数结果的拼接等}/*** 柯里化想要解决的问题: 柯里化方法的使用 柯里化的含义: 柯里化(currying)是与λ演算相关的重要概念。通过柯里化,可以把有多个输入的函数转换成只有一个输入的函数,从而可以在λ演算中来表示。 柯里化的名称来源于数学家 Haskell Curry。 Haskell Curry 是一位传奇性的人物,以他的名字命令了 3 种编程语言,Haskell、Brook 和 Curry。* 柯里化是把有多个输入参数的求值过程,转换成多个只包含一个参数的函数的求值过程。 对于清单 6 的函数 f(a, b, c),在柯里化之后转换成函数 g,则对应的调用方式是 g(a)(b)(c)。 函数 (x, y) -> x + y 经过柯里化之后的结果是 x -> (y -> x + y)。*/public static void curriedTest() {//设置函数 v1 vFunction3<Integer, Integer, Integer, Integer> function3 = (v1, v2, v3) -> (v1 + v2) * v3;//可以看出来是返回来了一个函数Function1<Integer, Function1<Integer, Integer>> apply = function3.curried().apply(1);//多次柯里化后就会返回我们想要的记过int result = function3.curried().apply(1).curried().apply(2).curried().apply(3);System.out.println(result);}/*** 记忆化方法 会将之前计算过的方法进行存储,相同参数在第二次调用的时候会使用缓存*/public static void memoized() {//计算差方Function2<BigInteger, Integer, BigInteger> pow = BigInteger::pow;//记忆化Function2<BigInteger, Integer, BigInteger> memoized = pow.memoized();long start = System.currentTimeMillis();memoized.apply(BigInteger.valueOf(1024), 1024);long end1 = System.currentTimeMillis();memoized.apply(BigInteger.valueOf(1024), 1024);long end2 = System.currentTimeMillis();System.out.printf("%d ms -> %d ms", end1 - start, end2 - end1);}/*** java  8 中的optional  是类似 其目的都是为了避免NPE的出现*/public static void optionTest() {//个人觉得option好用的地方在于这个of 静态函数。Option<String> str = Option.of("Hello");str.map(String::length);//使用对应的值Option<Integer> integers = str.flatMap(v -> Option.of(v.length()));boolean empty = integers.isEmpty();System.out.println(integers);}/*** either 的使用 包含两个值,left(异常值) 和 right(正确值)*/public static void eitherAndTryTest() {//这个是Either<String, String> either =compute().map(str -> str + " World").mapLeft(Throwable::getMessage);System.out.println(either);//Try的使用,不用写过多的catch,左后将left值交给某一个函数统一处理,//在pdt中有很多这样的代码,try catch 嵌套起来使用 包含参数定义的参数校验异常//Fruit.fromColor("1111");}private static ThreadLocalRandom random = ThreadLocalRandom.current();private static Either<Throwable, String> compute() {return random.nextBoolean()? Either.left(new RuntimeException("Boom!")): Either.right("Hello");}@Getterpublic enum Fruit {APPLE("APPLE", "BLACK"),BANANA("BANANA", "BLUE"),NONE("ORANGE", "WHITE");private final String name;private final String color;Fruit(String name, String color) {this.name = name;this.color = color;}public static Fruit fromColor(String color) {return Try.of(() -> Arrays.stream(Fruit.values()).filter(t -> t.getColor().equals(color)).findFirst().orElse(NONE)).toEither().getOrElse(NONE);}}/*** Lazy 表示的是一个延迟计算的值。在第一次访问时才会进行求值操作,而且该值只会计算一次。之后的访问操作获取的是缓存的值。 Lazy.of 从接口 Supplier 中创建 Lazy 对象。方法 isEvaluated 可以判断 Lazy 对象是否已经被求值。*/public static void LazyTest() {Lazy<BigInteger> lazy = Lazy.of(() ->BigInteger.valueOf(1024).pow(1024));System.out.println(lazy.isEvaluated());System.out.println(lazy.get());System.out.println(lazy.isEvaluated());System.out.println(lazy.get());System.out.println(lazy.isEvaluated());Lazy<BigInteger> lazy2 = Lazy.of(() ->BigInteger.valueOf(1024).pow(1024));System.out.println(lazy2.isEvaluated());System.out.println(lazy2.get());//未想到应用场景}public static void main(String[] args) {tupleTest();functionTest();curriedTest();memoized();LazyTest();}}

Java函数式编程神器 VAVR(vavr - turns java™ upside down)相关推荐

  1. Java函数式编程随想

    java函数式编程的类主要定义在java.util.function包下.快速浏览了下该包下的一些类和接口.读者要想看懂function相关的源码,也需要对lambda表达式和泛型有一定的了解.本文只 ...

  2. java 函数式编程 示例_功能Java示例 第8部分–更多纯函数

    java 函数式编程 示例 这是第8部分,该系列的最后一部分称为"示例功能Java". 我在本系列的每个部分中开发的示例是某种"提要处理程序",用于处理文档. ...

  3. Java 函数式编程和 lambda 表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...

  4. java函数式编程_Java 函数式编程和 lambda 表达式详解

    作者:DemonsI my.oschina.net/demons99/blog/2223079 为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要 ...

  5. Java函数式编程知识分享!

    Java是一种计算机编程语言,可用于编写桌面应用程序.Web应用程序.分布式系统和嵌入式系统应用程序等,是IT开发行业中最受欢迎的编程语言之一.想要学好Java必须要一步一个脚印打好基础.积攒实战经验 ...

  6. java全局变量怎么定义_Java开发知识点:如何理解Java函数式编程?

    Java是一种计算机编程语言,可用于编写桌面应用程序.Web应用程序.分布式系统和嵌入式系统应用程序等,是IT开发行业中最受欢迎的编程语言之一.想要学好Java必须要一步一个脚印打好基础.积攒实战经验 ...

  7. Java 函数式编程入门

    Java 函数式编程入门 函数式编程实战 改进 完整代码   像 JavaScript 这种语言很早就支持闭包了,虽然 C++ 很早就有了函数指针,Java 也很早就提供了反射中的 Method 类, ...

  8. 《深入理解Java函数式编程》系列文章

    Introduction 本系列文将帮助你理解Java函数式编程的用法.原理. 本文受启发于JavaOne 2016关于Lambda表达式的相关主题演讲Lambdas and Functional P ...

  9. java 函数式编程 示例_功能Java示例 第1部分–从命令式到声明式

    java 函数式编程 示例 功能编程(FP)的目的是避免重新分配变量,避免可变的数据结构,避免状态并全程支持函数. 如果将功能性技术应用于日常Java代码,我们可以从FP中学到什么? 在这个名为&qu ...

最新文章

  1. 因为一次 Kafka 宕机,终于搞透了 Kafka 高可用原理!
  2. java报错-找不到或无法加载主类(Error: Could not find or load main class)
  3. php配置连接sql2005(使用微软官方驱动)
  4. 比特币早期投资家:没有人能够阻止其发展 TechWeb 09-27 09:10 凤凰科技讯 据CNBC网站北京时间9月27日报道,风险投资家、“Social+Capital”基金创始人Chamath
  5. 磁珠与电感的区别,看了就灰常明白了
  6. First Missing Positive
  7. 人类最强运载火箭诞生!马斯克吹的牛再次兑现!
  8. TensorFlow和Keras入门必读教程
  9. 【IoT最佳实践】设备获取实时天气信息
  10. pads中如何设置等长_标签打印软件中标签间距以及边距如何设置
  11. 黄聪:演示 Rect、Bounds 生成 TRect 的区别
  12. GitHack 源码分析
  13. python调用adb shell命令_python(或BAT脚本)自动执行adb shell以后的命令
  14. 深入浅出Word2Vec原理解析
  15. 【商业信息】国家地区语言缩写码
  16. 一文读懂 快速掌握示波器使用及原理
  17. 怎么撰写一份优秀的数据分析报告(五)
  18. 史上最全Apidoc文档生成详解
  19. JAVA网络编程个人笔记 第4章 inet地址
  20. 占领大健康高地,育润羊奶粉新品火爆上市

热门文章

  1. 音响基本知识--有源音响 无源音响
  2. 聚宽数据python_聚宽量化(Zen)
  3. 中国互联网公司员工平均年龄出炉,平均年龄最低 27 岁,最高 33 岁
  4. 完美国际状态ID及对应说明!
  5. BigData JAQ入门
  6. nltk入门函数解释(concordance,similar,common_contexts)
  7. linux ll和ls的区别,linux中ll和ls的区别
  8. html怎么切换下一页,css-上下页切换
  9. 错误:‘x‘ is assigned a value but never used no-unused-vars
  10. gdb 如何调用函数?