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

时间:2015-03-17 20:21:34

标签: java lambda

尝试转换此段代码以摆脱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)));

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

3 个答案:

答案 0 :(得分:9)

在Java 8中,lambda表达式是实现功能接口的匿名内部类的替代。看起来您在使用Predicate,因为表达式为boolean

{8}是在Java 8中引入的,因此您需要自己重新创建它。您将无法创建defaultstatic方法,因此请保留功能界面方法。

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

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

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)));

答案 1 :(得分:2)

findPath需要Predicate作为第二个参数。您可以用

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

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

答案 2 :(得分:1)

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

  

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