首页IT科技java函数编程怎么写(Java 函数式编程「二」)

java函数编程怎么写(Java 函数式编程「二」)

时间2025-05-23 11:47:19分类IT科技浏览3352
导读:接上回,聊聊函子 functor。...

接上回            ,聊聊函子 functor        。

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

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

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; } } }

由于 Maybe 的 map 中包含判空的逻辑                ,因此调用 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 更易用             。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
mac10.15.6更新(苹果补充更新macOS Catalina10.15.7版本)