将 java 8 lambda 表达式转换为在 java 7 中工作

Converting java 8 lambda expression to work in java 7

尝试转换这部分代码以摆脱 lambda 表达式,以便它能够在 java 7

中工作
System.out.println(nicksGraph.findPath(nicksGraph.nodeWith(new Coordinate(0,0)), (a->a.getX()==3 && a.getY()==1), new PriorityQueue<Node<Coordinate>, Integer>(funcTotal)));

我环顾四周,但也许我只是没有正确理解它。

在 Java8 中,lambda 表达式替代了实现函数式接口的匿名内部 class。看起来您在这里使用的是 Predicate,因为表达式是 boolean.

Predicate interface是在Java8中引入的,需要自己重新创建。您将无法创建 defaultstatic 方法,因此只需保留功能接口方法即可。

public interface Predicate<T>
{
    public boolean test(T t);
}

然后,将 lambda 表达式替换为匿名 class 声明。

System.out.println(nicksGraph.findPath(
    nicksGraph.nodeWith(new Coordinate(0,0)),
    // Replacement anonymous inner class here.
    new Predicate<Coordinate>() {
       @Override
       public boolean test(Coordinate a) {
          // return the lambda expression here.
          return a.getX()==3 && a.getY()==1;
       }
    },
    new PriorityQueue<Node<Coordinate>, Integer>(funcTotal)));

findPath 需要一个 Predicate 作为第二个参数。您可以将 lambda 替换为

 new Predicate<>(){
     public boolean test(Integer i){
          return a.getX() == 3 && a.getY() == 1;
     }
 }

但主要问题只是 Predicate 本身的可用性,因为它是一个 java8 功能。此代码不会在 java7 中 运行,无论您是否使用 lambda。

看看Retrolambda。 它是 Java 8 的 lambda 表达式向 Java 7、6 和 5 的反向移植。

Just as there was Retroweaver et al. for running Java 5 code with generics on Java 1.4, Retrolambda lets you run Java 8 code with lambda expressions, method references and try-with-resources statements on Java 7, 6 or 5. It does this by transforming your Java 8 compiled bytecode so that it can run on an older Java runtime