有人可以帮助并向我解释如何将以下Java 1.8代码转换为Java 1.6吗?
private java.util.Optional<Edge<T>> findEdge(Node<T> node)
{
return edges.stream()
.filter(edge -> edge.isBetween(this, node))
.findFirst();
}
public boolean removeEdge(Node<T> node)
{
*java.util.Optional<Edge<T>> optional = findEdge(node);*
if (optional.isPresent())
{
return edges.remove(optional.get());
}
return false;
}
public boolean hasEdge(Node<T> node)
{
return findEdge(node).*isPresent();*
}
答案 0 :(得分:5)
假设edges
的类型为Collection<Edge>
:
private Edge<T> findEdge(Node<T> node)
{
for (Edge edge : edges) {
if (edge.isBetween(this, node)) {
return edge;
}
}
return null;
}
您必须遍历edges
,直到找到与过滤条件edge.isBetween(this, node)
匹配的边缘并返回该边缘。如果您找不到任何内容,则返回null,因为您没有Optional
是Java 6。
其他方法甚至更简单 - 因为您没有Optional
包裹Edge
,您只需检查findEdge
返回的值是否为空。
public boolean removeEdge(Node<T> node)
{
Edge<T> e = findEdge(node);
if (e != null)
{
return edges.remove(e);
}
return false;
}
public boolean hasEdge(Node<T> node)
{
return findEdge(node) != null;
}
答案 1 :(得分:2)
Guava 可以利用您的Lambda相似的代码逻辑(函数式编程习语):
com.google.common.base.Optional<Edge> opt = FluentIterable.<Edge>from(edges)
.filter(new Predicate<Edge>() {
@Override public boolean apply(Edge edge) {
return edge.isBetween(XXX.this, node);
}})
.first();
if(opt.isPresent()) {...}
com.google.common.base.Optional
也是通用类。而nonymous类使用起来既笨拙又冗长,但它不会改变你的代码逻辑。这是一个权衡,你可以选择这个 Guava 解决方案或循环一个。
答案 2 :(得分:1)
这里提到的其他答案都可行 - 即使用Guava和/或手动转换Java 8 lambda代码以使用Java 6。
另一个选择是使用retrolambda库向Java 7,6和5反向移植Java 8的lambda表达式和方法引用。请检查项目的Github页面,了解哪些功能被反向移植的最新详细信息(自库以来)正在积极发展中。)