【问题标题】:No access to a parameter needed in a predicate无法访问谓词中所需的参数
【发布时间】:2020-05-05 20:41:45
【问题描述】:

我有以下两种方法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”对象?

提前谢谢你。

【问题讨论】:

  • 这里的date1date2 是什么?而fc的类型是什么?
  • 接受了下面的答案。谢谢@Kirill Simonov

标签: java lambda predicate functional-interface


【解决方案1】:

removeIf() 采用Predicate&lt;? super E&gt;,其中EgetFicheControles() 返回的集合中的任何类型。为了这个答案,让它成为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)
                            )));
}

【讨论】:

  • 通过通用 E 是我所缺少的。非常感谢@Andreas
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2015-09-07
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多