Java函数式编程神器 VAVR(vavr - turns java™ upside down)
什么是函数式编程
- 基本概念:他是一种编程范式,对于函数式编程来说,它只关心定义输入数据和输出数据相关的关系,数学表达式里面其实是在做一种映射(mapping),输入的数据和输出的数据关系是什么样的,是用函数来定义的。
- 特征:
- stateless:函数不维护任何状态。函数式编程的核心精神是 stateless,简而言之就是它不能存在状态,打个比方,你给我数据我处理完扔出来。里面的数据是不变的。
- immutable:输入数据是不能动的,动了输入数据就有危险,所以要返回新的数据集。(不可变的)
Java为什么要函数式编程
- 优势
- 没有状态就没有伤害。
- 并行执行无伤害。
- 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)相关推荐
- Java函数式编程随想
java函数式编程的类主要定义在java.util.function包下.快速浏览了下该包下的一些类和接口.读者要想看懂function相关的源码,也需要对lambda表达式和泛型有一定的了解.本文只 ...
- java 函数式编程 示例_功能Java示例 第8部分–更多纯函数
java 函数式编程 示例 这是第8部分,该系列的最后一部分称为"示例功能Java". 我在本系列的每个部分中开发的示例是某种"提要处理程序",用于处理文档. ...
- Java 函数式编程和 lambda 表达式
为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...
- java函数式编程_Java 函数式编程和 lambda 表达式详解
作者:DemonsI my.oschina.net/demons99/blog/2223079 为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要 ...
- Java函数式编程知识分享!
Java是一种计算机编程语言,可用于编写桌面应用程序.Web应用程序.分布式系统和嵌入式系统应用程序等,是IT开发行业中最受欢迎的编程语言之一.想要学好Java必须要一步一个脚印打好基础.积攒实战经验 ...
- java全局变量怎么定义_Java开发知识点:如何理解Java函数式编程?
Java是一种计算机编程语言,可用于编写桌面应用程序.Web应用程序.分布式系统和嵌入式系统应用程序等,是IT开发行业中最受欢迎的编程语言之一.想要学好Java必须要一步一个脚印打好基础.积攒实战经验 ...
- Java 函数式编程入门
Java 函数式编程入门 函数式编程实战 改进 完整代码 像 JavaScript 这种语言很早就支持闭包了,虽然 C++ 很早就有了函数指针,Java 也很早就提供了反射中的 Method 类, ...
- 《深入理解Java函数式编程》系列文章
Introduction 本系列文将帮助你理解Java函数式编程的用法.原理. 本文受启发于JavaOne 2016关于Lambda表达式的相关主题演讲Lambdas and Functional P ...
- java 函数式编程 示例_功能Java示例 第1部分–从命令式到声明式
java 函数式编程 示例 功能编程(FP)的目的是避免重新分配变量,避免可变的数据结构,避免状态并全程支持函数. 如果将功能性技术应用于日常Java代码,我们可以从FP中学到什么? 在这个名为&qu ...
最新文章
- 因为一次 Kafka 宕机,终于搞透了 Kafka 高可用原理!
- java报错-找不到或无法加载主类(Error: Could not find or load main class)
- php配置连接sql2005(使用微软官方驱动)
- 比特币早期投资家:没有人能够阻止其发展 TechWeb 09-27 09:10 凤凰科技讯 据CNBC网站北京时间9月27日报道,风险投资家、“Social+Capital”基金创始人Chamath
- 磁珠与电感的区别,看了就灰常明白了
- First Missing Positive
- 人类最强运载火箭诞生!马斯克吹的牛再次兑现!
- TensorFlow和Keras入门必读教程
- 【IoT最佳实践】设备获取实时天气信息
- pads中如何设置等长_标签打印软件中标签间距以及边距如何设置
- 黄聪:演示 Rect、Bounds 生成 TRect 的区别
- GitHack 源码分析
- python调用adb shell命令_python(或BAT脚本)自动执行adb shell以后的命令
- 深入浅出Word2Vec原理解析
- 【商业信息】国家地区语言缩写码
- 一文读懂 快速掌握示波器使用及原理
- 怎么撰写一份优秀的数据分析报告(五)
- 史上最全Apidoc文档生成详解
- JAVA网络编程个人笔记 第4章 inet地址
- 占领大健康高地,育润羊奶粉新品火爆上市
热门文章
- 音响基本知识--有源音响 无源音响
- 聚宽数据python_聚宽量化(Zen)
- 中国互联网公司员工平均年龄出炉,平均年龄最低 27 岁,最高 33 岁
- 完美国际状态ID及对应说明!
- BigData JAQ入门
- nltk入门函数解释(concordance,similar,common_contexts)
- linux ll和ls的区别,linux中ll和ls的区别
- html怎么切换下一页,css-上下页切换
- 错误:‘x‘ is assigned a value but never used no-unused-vars
- gdb 如何调用函数?