首页 > 编程语言 >Java 函数式编程「二」

Java 函数式编程「二」

时间:2022-11-20 20:55:18浏览次数:64  
标签:map Java 函数 Just Maybe 编程 value return public

上回,聊聊函子 functor

functor 是一个容器。该容器的 value 属性指向被包裹的数据;该容器的 map 方法对容器进行映射变换。

以下代码实现一个最普通的 functor,称之为 Just, 根据 map 的传参 fnvalue 进行变换:

class Just<T> {
  private final T value;

  private Just(T value) {
    this.value = value;
  }

  public static <T> Just<T> of(T value) {
    return new Just<>(value);
  }

  public <R> Just<R> map(Function<T, R> fn) {
    return of(fn.apply(this.value));
  }

  public T flat() {
    return this.value;
  }
}

map 会继续返回 functor,因此可以链式调用:

public static void main(String[] args) {
  System.out.println(
    Just.of(1)
      .map(a -> a + 2)
      .map(a -> a * a)
      .flat()
  );
}

将数据用容器 functor 包装,通过唯一的 map 方法对数据进行变换,使得我们很容易封装类似切面的逻辑。例如:将判空的逻辑封装到 map 中,得到函子 Maybe

class Maybe<T> {
  public static final Maybe<?> EMPTY = new Maybe(null);

  private final T value;

  private Maybe(T value) {
    this.value = value;
  }

  public static <T> Maybe<T> of(T value) {
    if (value == null) {
      return (Maybe<T>) EMPTY;
    } else {
      return new Maybe<>(value);
    }
  }

  public <R> Maybe<R> map(Function<T, R> fn) {
    if (this == EMPTY) {
      return (Maybe<R>) EMPTY;
    } else {
      return of(fn.apply(this.value));
    }
  }

  public T orElse(T v) {
    if (this == EMPTY) {
      return v;
    } else {
      return this.value;
    }
  }
}

由于 Maybemap 中包含判空的逻辑,因此调用 map 不用考虑空值,只需要在最后考虑空值。它使得我们更多地关注正常数据流。

class Person {
  public String name;
  public Car car;
}

class Car {
  public String label;
}

public class Test {
  public static void main(String[] args) {
    Person apolis = new Person();
    apolis.name = "apolis";

    System.out.println(
      Maybe.of(apolis)
        .map(p -> p.car)
        .map(c -> c.label)
        .orElse("no car")
    );
  }
}

Maybe 函子在 java 中对应的实现是类 Optional

如果你能找出下面代码里的问题,就证明你已经掌握了 Optional 的用法:

// 问题代码
String name = "";
Optional<String> optional = result.getPrimaryMap()
  .values().stream().findFirst();
if (optional.isPresent()) {
  name = optional.get();
}

java 有了 Optional,可以表达更多的信息。例如:一个方法的返回值类型是 Optional<XXX>,会告诉调用者,该方法有可能返回空值。如果我们能统一规范:会返回空值的方法都改为返回 Optional,将使 api 更易用。

标签:map,Java,函数,Just,Maybe,编程,value,return,public
From: https://www.cnblogs.com/apolis/p/16909506.html

相关文章

  • 习以为常的vba函数Format居然可以四则运算
    今天和朋友无意中聊起,他提到,format函数可以做运算。一测试,果然可以。而且支持四则运算,但不支持函数等。SubTest()MsgBoxFormat(1+1+2,"0.00")endsub......
  • java process exe.exec 执行exe程序
    以前好奇怎么让java调用普通的exe程序,让exe程序协同java一起处理数据,一直也没时间看。只有这么两行零散的代码,惭愧,没有实践过。先堆这......
  • 简单函数
    【【【2013-9-13】】】--模糊查询关键字 like--与通配符联合使用('_'任意一个字符;'%'任意长度的字符;转义字符'/'和关键字escape联用)select*from......
  • java常用类
    常用类ObjectgetClass()返回object()的运行时类hashCode()返回对象的哈希码值toString()返回对象的字符串表示形式equals(objectobj)指示一些对象是否等于此f......
  • javascript入门
    javascript入门1.javascript的介绍JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部......
  • Java8的新特性
    Java8的新特性1.*新特性简介速度更快代码更少(增加了新的语法Lambda表达式)强大的StreamAPI便于并行最大化减少空指针异常Optional其中最核心的是Lambda表达式和S......
  • java——线程同步机制——解决线程安全问题——Lock锁
    解决线程安全问题——Lock锁解决线程安全问题的三种方案:使用Lock锁java.util.concurrent.locks.Lock接口Lock实现提供了比使用synchronized方法和语句可获得的更广......
  • 从Scratch 2学到的一些编程思想
    从Scratch2学到的一些编程思想所有程序都是事件驱动的mingdu.zhengatgmaildotcomScratch是麻省理工大学(MIT)为8~16岁的孩子开发的编程工具。Scratch的基本原理是为所选......
  • java——线程同步机制——解决线程安全问题——同步方法
                                                        ......
  • 嵌入式软件异步编程:同步还是异步?
    异步并不总是提高效率的,那什么时候用同步,什么时候用异步呢?mingdu.zhengatgmaildotcom异步要解决的是CPU和I/O速度差异的问题,所以异步适合I/O远慢于CPU的情况,如果I/O仅稍......