我正在尝试使用lambdas来获得乐趣.我创建了一个允许lambda组成的仿函数.但是,组合方式只允许线性变换,并且不允许分支.
我的想法是,我知道将来会有一个有效的不可变状态数据结构.我想组成一个从状态中提取值的变换; 并将执行一系列步骤,这些步骤可能需要或可能不需要状态,以执行转换.
为此,我创建了两个类.功能接口的工作方式类似java.util.function.Function
,但在andThen
方法中采用BiFunction ,允许将state参数从lambda传递给lambda.
import java.util.Objects;
import java.util.function.BiFunction;
@FunctionalInterface
public interface Procedure<S, T> {
T procede(S stateStructure);
default <R> Procedure<S, R> andThen(BiFunction<S, T, R> after) {
Objects.requireNonNull(after);
return (param) -> after.apply(param, procede(param));
}
}
Run Code Online (Sandbox Code Playgroud)
仿函数相当简单,有两个映射函数(一个利用状态,一个不利用),两个终止方法最终确定转换(同样,有和没有状态).
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
public class ProcedureContainer<S, T> {
protected final Procedure<S, T> procedure;
protected ProcedureContainer(final Procedure<S, T> procedure) {
this.procedure = procedure;
}
public static <S, R> ProcedureContainer<S, R> initializeContainer(
final Function<S, R> initialDataRetriever) { …
Run Code Online (Sandbox Code Playgroud) 我目前正在用Java创建自己的持久性数组,该数组使用二进制搜索树存储值的集合。
我想添加一个以a Function
作为参数的map方法来生成一个新数组。除非请求特定值,否则我不希望评估这些功能。这是很简单的事情,因为lambdas是惰性评估的。但是,我也只希望函数只被评估一次,即使多次请求结果也是如此。
我可以创建一个存储供应商的节点,并在评估时更新结果:
class Node<T> {
private T value;
private Supplier<T> supplier;
public T get() {
if (null != value)
return value;
value = supplier.get();
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
... where supplier
是从Function
应用于持久化数组旧版本中的值得出的。
但是,这不再是一种功能性方法,并且有可能在多线程系统中引起错误*。在供应商返回空值**的情况下,这也不会产生任何优势。
另一种方法是Node
在get调用中返回的实例:
class Node<T> {
private final Optional<T> value;
private final Supplier<T> supplier;
Node(Supplier<T> supplier, T value) {
this.supplier = supplier;
this.value = Optional.ofNullable(value);
}
public Tuple<Node<T>, T> get() {
if (null != value)
return new Tuple<>(this, value.orElse(null));
T result = …
Run Code Online (Sandbox Code Playgroud) 我正在搞乱F#和Fable,并试图测试我的理解.为此,我尝试创建一个函数来计算给定一定次数的迭代次数.我想出的是
let eCalc n =
let rec internalECalc ifact sum count =
match count = n with
| true -> sum
| _ -> internalECalc (ifact / (float count)) (sum + ifact) (count+1)
internalECalc 1.0 0.0 1
Run Code Online (Sandbox Code Playgroud)
哪个工作正常,调用后返回2.7182818284590455
eCalc 20
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用,我认为是更正确的形式
let eCalc n =
let rec internalECalc ifact sum count =
match count with
| n -> sum
| _ -> internalECalc (ifact / (float count)) (sum + ifact) (count+1)
internalECalc 1.0 0.0 1
Run Code Online (Sandbox Code Playgroud)
我收到警告"[警告]此规则永远不会匹配(L5,10-L5,11)",返回值为0.(如果我在匹配中交换'n'和'count',也会发生同样的事情声明).有没有理由我不能在比赛声明中使用'n'?有没有办法解决这个问题,所以我可以使用'n'?
谢谢
我在远程计算机(k8_host)上启动了一个 minikube 实例。我正在尝试从本地计算机(client_comp)连接到它。我按照此处给出的指示进行设置并移动证书。
看来我可以在 client_comp 上成功使用 kubectl 执行 ping 操作,但收到证书错误:
$ kubectl get pods
Unable to connect to the server: x509: certificate is valid for 192.168.49.2, 10.96.0.1, 127.0.0.1, 10.0.0.1, not 192.168.1.69
Run Code Online (Sandbox Code Playgroud)
当我检查 minikube 的 IP 设置时,我得到
$minikube ip
192.168.49.2
Run Code Online (Sandbox Code Playgroud)
k8_host的ip是192.168.1.69。
如果我理解正确的话,似乎当 minikube 启动时,它会自动生成一组证书,这需要一个域。因此,它使用 k8_host 上的 minikube 本地 IP (192.168.49.2) 创建了证书。而且,当我尝试从 client_comp 进行连接时,它将主机设置为 k8_host 的网络 IP (192.168.1.69)。
我需要更新证书吗?我猜测,由于 nginx 设置为仅传递 ssl 证书(使用流),所以我不能只在 nginx 配置中添加正确的主机。
作为将来的参考,我在 minikube 设置过程中是否做错了什么?
以供参考:
~/.kube/config(在 client_comp 上)
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: [redacted]
server: …
Run Code Online (Sandbox Code Playgroud)