将带有lambda表达式的Java 8代码转换为Java 6

时间:2014-12-09 06:50:58

标签: java lambda java-8 java-6

有人可以帮助并向我解释如何将以下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();*
}

3 个答案:

答案 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页面,了解哪些功能被反向移植的最新详细信息(自库以来)正在积极发展中。)