Java 8 番石榴到Java 8的转换

Java 8 番石榴到Java 8的转换,java-8,guava,Java 8,Guava,我正在将我的Guava函数和谓词迁移到Java8。未参数化的预测很容易,我只是从一个类更改到另一个接口,并在apply()方法前面加上一个“default”。我一直坚持的是参数化谓词。如何在Java8中定义可重用的参数化谓词。以下是我目前的番石榴代码: import com.google.common.base.Predicate public class InSectorPredicate implements Predicate<Unit> { private fina

我正在将我的Guava函数和谓词迁移到Java8。未参数化的预测很容易,我只是从一个类更改到另一个接口,并在apply()方法前面加上一个“default”。我一直坚持的是参数化谓词。如何在Java8中定义可重用的参数化谓词。以下是我目前的番石榴代码:

import com.google.common.base.Predicate

public class InSectorPredicate implements Predicate<Unit> {
    private final SectorCoords coords;

    public InSectorPredicate(SectorCoords coords) {
        this.coords = coords;
    }

    @Override
    public boolean apply(Unit unit) {
        return unit.getCoords().equals(coords);
    }
}
import com.google.common.base.Predicate
公共类InSectorPredicate实现谓词{
私人最终部门协调;
公共昆虫库谓词(SectorCoords coords){
this.coords=coords;
}
@凌驾
公共布尔应用(单位){
返回单位.getCoords().equals(coords);
}
}

更改
应用
测试
不起作用

并明显替换
import com.google.common.base.Predicate
导入java.util.function.Predicate


接口无法维护状态。问题是coords参数

但它不需要是一个接口?您可以简单地使用您已经使用过的类。或者,当您处于迁移状态时,只需继续使用Guava谓词,因为Guava谓词的类型签名是

公共接口谓词扩展了java.util.function.Predicate
,因此它们将继续在Java8上工作

根据番石榴谓词的JD:

  * <p>As this interface extends {@code java.util.function.Predicate}, an instance of this type may  
  * be used as a {@code Predicate} directly.  To use a {@code java.util.function.Predicate} where a  
  * {@code com.google.common.base.Predicate} is expected, use the method reference {@code  
  * predicate::test}.  
*当此接口扩展{@code java.util.function.Predicate}时,可能会出现此类型的实例
*可以直接用作{@code谓词}。要使用{@code java.util.function.Predicate},其中
*{@code com.google.common.base.Predicate},请使用方法引用{@code
*谓词::test}。
示例代码,如果您想要端口

public class InSectorPredicate8 implements java.util.function.Predicate<Unit> {
    private final SectorCoords coords;

    public InSectorPredicate8(SectorCoords coords) {
        this.coords = coords;
    }

    @Override
    public boolean test(Unit unit) {
        return unit.getCoords().equals(coords);
    }
}
公共类InSectorPredicate8实现java.util.function.Predicate{
私人最终部门协调;
公共昆虫预测8(部门协调){
this.coords=coords;
}
@凌驾
公共布尔测试(单位){
返回单位.getCoords().equals(coords);
}
}
但是,根据具体的用法,在大多数情况下,在构造InSectorPredicate时,您可以简单地

Predicate<Unit> InSectorPredicate = new InSectorPredicate(coords);
Predicate-InSectorPredicate=新的InSectorPredicate(coords);
迁移到

Predicate<Unit> InSectorPredicate = (Unit unit) -> unit.getCoords().equals(coords);
Predicate-InSectorPredicate=(Unit-Unit)->Unit.getCoords().equals(coords);

接口无法维护状态。问题是coords参数。嗯,是的,但是
InSectorPredicate8
是一个类,也请听@Holger关于将“default”放在apply()前面的评论。“我只是从一个类更改到另一个接口,并将“default”放在apply()方法前面”-你到底为什么要这样做?或者更简短的
Predicate-InSectorPredicate=unit->unit.getCoords().equals(coords)