将java 8 lambda表达式转换为在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, Integer>(funcTotal))); 

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

在Java 8中,lambda表达式是实现function接口的匿名内部类的替代。 看起来你在这里使用Predicate ,因为表达式是一个boolean

Predicate接口是在Java 8中引入的,因此您需要自己重新创建它。 您将无法创建defaultstatic方法,因此请保留function接口方法。

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

然后,使用匿名类声明替换lambda表达式。

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

findPath需要Predicate作为第二个参数。 你可以用lambd替换lambda

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

但主要问题只是Predicate本身的可用性,因为它是一个java8function。 无论你是否使用lambdas,这段代码都不会在java7中运行。

看看Retrolambda吧 。 它是Java 8的lambda表达式向Java 7,6和5的后端。

就像Retroweaver等人一样。 为了在Java 1.4上运行带有generics的Java 5代码,Retrolambda允许您在Java 7,6或5上运行带有lambda表达式,方法引用和try-with-resources语句的Java 8代码。它通过转换Java 8编译的字节码来实现它可以在较旧的Java运行时上运行