gpt4 book ai didi

java 8 lambda 与先前的值

转载 作者:行者123 更新时间:2023-11-30 07:45:01 25 4
gpt4 key购买 nike

我如何/我可以更改以下方法以使用流?

在命令式编程风格中,我存储了前一个城市值,并且必须使用它来获取下一个值,请参阅e.getOther()(不要问我为什么)。

问题的焦点是:如何用streams/lambda实现同样的输出?

private <V extends City, E extends WeightedEdge<V>> void printWeightedEdgePath(List<E> pathList, V srcVertex, V destVertex) {
PrintVisitor printVisitor = new PrintVisitor();
if (!pathList.isEmpty()) {
V atThisCity = srcVertex;
System.out.printf("%s to %s: %s", srcVertex, destVertex, srcVertex);
pathList.stream().forEach(edge -> { // stream way - error
printVisitor.accept(edge);
System.out.printf(" --%2.2f-->", e.weight());
atThisCity = e.getOther(atThisCity); // variable must be final
printVisitor.accept(atThisCity);
});
System.out.println();
} else {
System.out.printf("%s to %s: not connected\n", srcVertex, destVertex);
}
System.out.println();
}

编辑:感谢@Bohemian 技巧 - 使用 obj 数组欺骗 java 退出 Final。

private <V extends City, E extends Edge<V>> void printEdgePath(List<E> pathList, V srcVertex, V destVertex) {
PrintVisitor printVisitor = new PrintVisitor();
if (!pathList.isEmpty()) {
Vertex [] atThisCity = new Vertex[]{srcVertex};
System.out.printf("%s to %s: %s", srcVertex, destVertex, srcVertex);
pathList.stream().forEach(edge -> {
printVisitor.accept(edge);
@SuppressWarnings("unchecked")
V nextCity = edge.getOther((V)atThisCity[0]);
atThisCity[0] = nextCity;
printVisitor.accept(atThisCity[0]);
});
System.out.println();
} else {
System.out.printf("%s to %s: not connected\n", srcVertex, destVertex);
}
System.out.println();
}

最佳答案

以下是规避“有效最终”要求的解决方法:

如果需要修改 lambda 中的值,请使用数组。虽然数组是最终的,但其内容可能会发生变化。即:

Object[] array = new Object[1];
someStream.forEach(o -> {processPreviousAndCurrent(array[0], o); array[0] = o;});

在这个简单的示例中,数组保存先前的值。

在您的示例中,执行以下操作:

 private <V extends City, E extends WeightedEdge<V>> void printWeightedEdgePath(List<E> pathList, V srcVertex, V destVertex) {
PrintVisitor printVisitor = new PrintVisitor();
if (!pathList.isEmpty()) {
Object[] atThisCity = new Object[]{srcVertex};
System.out.printf("%s to %s: %s", srcVertex, destVertex, srcVertex);
pathList.stream().forEach(edge -> {
printVisitor.accept(edge);
System.out.printf(" --%2.2f-->", e.weight());
atThisCity[0] = e.getOther((V)atThisCity[0]);
printVisitor.accept(atThisCity);
});
System.out.println();
} else {
System.out.printf("%s to %s: not connected\n", srcVertex, destVertex);
}
System.out.println();
}

关于java 8 lambda 与先前的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34057731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com