Нет доступа к параметру, необходимому в предикате - PullRequest
0 голосов
/ 05 мая 2020

У меня есть два следующих метода: 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)))
                            );
}

проблема в том, что я не знаю, как передать "f c "объект в" extractMethod "?

Заранее спасибо.

1 Ответ

1 голос
/ 06 мая 2020

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)
                            )));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...