接上回,聊聊函子 functor,
functor 是一個容器,該容器的 value 屬性指向被包裹的資料;該容器的 map 方法對容器進行映射變換,

以下代碼實作一個最普通的 functor,稱之為 Just, 根據 map 的傳參 fn 對 value 進行變換:
class Just<T> {
private final T value;
private Just(T value) {
this.value = https://www.cnblogs.com/apolis/archive/2022/11/20/value;
}
public static Just of(T value) {
return new Just<>(value);
}
public Just map(Function 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 = https://www.cnblogs.com/apolis/archive/2022/11/20/value;
}
public static Maybe of(T value) {
if (value == null) {
return (Maybe) EMPTY;
} else {
return new Maybe<>(value);
}
}
public Maybe map(Function fn) {
if (this == EMPTY) {
return (Maybe) 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 更易用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/536841.html
標籤:其他
