我对函数编程比较新,而我正试图使用Java中的Lambda功能来尝试进行函数编程。我知道Java不是学习函数编程的好选择,但在我的办公室里,我只能使用Java,并且希望能够在那里应用一些这些原则。
我在Java中创建了一个类似于Optional单子类型的东西,其代码如下:
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