无法访问谓词中所需的参数
No access to a parameter needed in a predicate
我有以下两种方法 method1 和 method2 :
public void method1(){
List<Integer> p = ...
listRefCtl.forEach(x->
x.getDomains().forEach(domain ->
domaine.getRisks().forEach(risk ->
attribution.getFicheControles().removeIf(fc ->
!DateUtil.isBetween(fc.getT().getDateT(), p.get(0), p.get(1)))))
)
)
);
}
public void method2(){
List<Integer> p = ...
listRefCtl.forEach(x->
x.getDomains().forEach(domain ->
domaine.getRisks().forEach(risk ->
attribution.getFicheControles().removeIf(fc ->
!DateUtil.isAfter(date1, date2)))
)
)
);
}
如您所见,除了我在 removeIf 方法中有两个不同的谓词外,它是同一段代码:
!DateUtil.isBetween(fc.getT().getDateT(), p.get(0), p.get(1))
和
!DateUtil.isAfter(date1, date2)
我想提取这样的方法
public void method1(){
List<Integer> p = ...
extractedMethod(() -> !DateUtil.isBetween(fc.getT().getDateT(), p.get(0), p.get(1)));
}
public void method2(){
List<Integer> p = ...
extractedMethod(() -> !DateUtil.isAfter(date1, date2));
}
public void extractedMethod(predicate){
listRefCtl.forEach(x->
x.getDomains().forEach(domain ->
domaine.getRisks().forEach(risk ->
attribution.getFicheControles().removeIf(predicate)))
);
}
问题是我不知道如何在 "extractedMethod" 中传递 "fc" 对象?
提前致谢。
removeIf()
采用 Predicate<? super E>
,其中 E
是 getFicheControles()
返回的集合中的任何类型。为了这个答案,让它成为 Foo
.
public void method1() {
List<Integer> p = ...
extractedMethod(fc -> !DateUtil.isBetween(fc.getT().getDateT(), p.get(0), p.get(1)));
}
public void method2() {
List<Integer> p = ...
extractedMethod(fc -> !DateUtil.isAfter(date1, date2));
}
public void extractedMethod(Predicate<Foo> filter) {
listRefCtl.forEach(x->
x.getDomains().forEach(domain ->
domaine.getRisks().forEach(risk ->
attribution.getFicheControles().removeIf(filter)
)));
}
我有以下两种方法 method1 和 method2 :
public void method1(){
List<Integer> p = ...
listRefCtl.forEach(x->
x.getDomains().forEach(domain ->
domaine.getRisks().forEach(risk ->
attribution.getFicheControles().removeIf(fc ->
!DateUtil.isBetween(fc.getT().getDateT(), p.get(0), p.get(1)))))
)
)
);
}
public void method2(){
List<Integer> p = ...
listRefCtl.forEach(x->
x.getDomains().forEach(domain ->
domaine.getRisks().forEach(risk ->
attribution.getFicheControles().removeIf(fc ->
!DateUtil.isAfter(date1, date2)))
)
)
);
}
如您所见,除了我在 removeIf 方法中有两个不同的谓词外,它是同一段代码:
!DateUtil.isBetween(fc.getT().getDateT(), p.get(0), p.get(1))
和
!DateUtil.isAfter(date1, date2)
我想提取这样的方法
public void method1(){
List<Integer> p = ...
extractedMethod(() -> !DateUtil.isBetween(fc.getT().getDateT(), p.get(0), p.get(1)));
}
public void method2(){
List<Integer> p = ...
extractedMethod(() -> !DateUtil.isAfter(date1, date2));
}
public void extractedMethod(predicate){
listRefCtl.forEach(x->
x.getDomains().forEach(domain ->
domaine.getRisks().forEach(risk ->
attribution.getFicheControles().removeIf(predicate)))
);
}
问题是我不知道如何在 "extractedMethod" 中传递 "fc" 对象?
提前致谢。
removeIf()
采用 Predicate<? super E>
,其中 E
是 getFicheControles()
返回的集合中的任何类型。为了这个答案,让它成为 Foo
.
public void method1() {
List<Integer> p = ...
extractedMethod(fc -> !DateUtil.isBetween(fc.getT().getDateT(), p.get(0), p.get(1)));
}
public void method2() {
List<Integer> p = ...
extractedMethod(fc -> !DateUtil.isAfter(date1, date2));
}
public void extractedMethod(Predicate<Foo> filter) {
listRefCtl.forEach(x->
x.getDomains().forEach(domain ->
domaine.getRisks().forEach(risk ->
attribution.getFicheControles().removeIf(filter)
)));
}