Использование функционального интерфейса в качестве параметров функции filter () в Java 8 - PullRequest
0 голосов
/ 04 июня 2018

Это фрагмент кода, который пытается использовать функциональный интерфейс внутри функции фильтра.

Function<Path, Boolean> isNotPartitionFile = (path) -> {
    if(!path.toString().contains("partition")) {
        return true;
    }
    return false;
};

List<Path> pathsList =  Files.walk(Paths.get(extractFilesLocation))
                                 .filter(Files::isRegularFile)
                                 .filter(isNotPartitionFile)
                                 .collect(Collectors.toList());

Когда я пытаюсь использовать isNotPartitionFile в качестве параметра для функции filter(), затмение всплываетдо ошибки, которая говорит The method filter(Predicate<? super Path>) in the type Stream<Path> is not applicable for the arguments (Function<Path,Boolean>).Также предлагается привести к (Predicate<? super Path>), но при этом выдается ошибка времени выполнения, которая говорит о невозможности его приведения.Как мне это преодолеть?

Ответы [ 5 ]

0 голосов
/ 04 июня 2018

Stream<T> filter(Predicate<? super T> predicate) применить предикат в качестве параметра.

Предикат является логической функцией.

Попробуйте:

Predicate<Path> isNotPartitionFile = path -> !path.toString().contains("partition");
0 голосов
/ 04 июня 2018

Я сам нашел решение.

Функция filter ожидает функцию в качестве параметра, но функциональный интерфейс был пропущен.Поэтому его необходимо заменить функцией apply интерфейса Function.

List<Path> pathsList =  Files.walk(Paths.get(extractFilesLocation))
                                 .filter(Files::isRegularFile)
                                 .filter(isNotPartitionFile::apply)
                                 .collect(Collectors.toList());
0 голосов
/ 04 июня 2018

Это должно работать,

Predicate<Path> isNotPartitionFile = path -> {
    if (!path.toString().contains("partition")) {
        return true;
    }
    return false;
};

Predicate интерфейс содержит метод test (), который принимает один аргумент и возвращает значение Boolean.Вы просто передаете Path, и он возвращает значение Boolean.

0 голосов
/ 04 июня 2018

Predicate - это функция, которая принимает значение и всегда возвращает boolean..filter ожидает Predicate<T>, а не Function<T, Boolean>.Причина, по которой Predicate<T> не распространяется Function<T, Boolean>, заключается в том, что Predicate<T> возвращает boolean, который никогда не может быть нулевым.Чтобы исправить вашу проблему, вы можете изменить isNotPartitionFile на

Predicate<Path> isNotPartitionFile = (path) -> path.toString().contains("partition");
0 голосов
/ 04 июня 2018

isNotPartitionFile следует определить как:

Predicate<Path> isNotPartitionFile = path -> !path.toString().contains("partition");

, поскольку filter потребляет Predicate<T>, а не Function<T, R>.

...