【发布时间】:2014-10-02 19:46:31
【问题描述】:
我是函数式编程的新手,我正在尝试使用 Java 中的 Lambda 功能来尝试执行 FP。我知道 Java 不是学习函数式的好选择,但在我的办公室里我只能使用 Java,我很想在那里应用其中的一些原则。
我在 Java 中创建了一个 Optional monad 类型的东西,它看起来像这样:
public abstract class Optional<T> implements Monad<T> {
//unit function
public static <T> Optional<T> of(T value) {
return value != null ? new Present<T>(value) : Absent.<T>instance();
}
@Override
public <V> Monad<V> flatMap(Function<T, Monad<V>> function) {
return isPresent() ? function.apply(get()) : Absent.<V>instance();
}
}
我使用它来避免在我的代码中嵌套null 检查,我使用它的典型用例是当我需要类似firstNonNull 的东西时。
用途:
String value = Optional.<String>of(null)
.or(Optional.<String>of(null)) //call it some reference
.or(Optional.of("Hello")) //other reference
.flatMap(s -> {
return Optional.of(s.toLowerCase());
})
.get();
这是一种魅力。现在的问题是我如何将日志记录与此结合起来?如果我需要知道使用了哪些参考资料怎么办?如果这些引用附加了一些语义并且我需要记录未找到此引用并尝试其他选项,这将很有用。
日志:
some reference is not present and some other business case specific log
这可以在Java中实现吗?我试图从网上阅读一些可能的解决方案,并找到了 Haskell 的 Writer monad,但我很困惑,无法跟上。
编辑
链接到gist
【问题讨论】:
-
为什么要重新发明 Optional? Java 8 已经引入this class。
-
@Eran 我这样做只是为了学习单子类型的基本原理。只是为了好玩。
-
所以你想计算哪个引用与计数器一起使用?
-
@PeterLawrey 也许我解释不正确,实际上我需要知道的是哪个参考被跳过,哪个被使用。用于调试级别的日志。
-
你能把你所有的代码贴出来让我/我们玩玩吗?例如 or() 在哪里定义?
标签: java functional-programming java-8 monads