Реализация методов And и OR в бифункциях с использованием обобщений

#java #arrays #generics #java-8

#java #массивы #дженерики #java-8

Вопрос:

Я пытаюсь реализовать методы «и» и «или» в бифункции так, как мы используем в предикатах.

Итак, мой функциональный интерфейс bifunction имеет один абстрактный метод, который принимает два объекта в качестве аргументов и возвращает список.

Я попробовал это:

 public interface TriFunctionInterface<T, U, R> {
    List<R> applyFilter(T t, U u, List<R> r);
    default TriFunctionInterface or(TriFunctionInterface other) {
        Objects.requireNonNull(other);
        return (T t, U u, List<R> r) -> {
            List<R> finalList = new ArrayList<>();
            List<R> filteredObjects1 = applyFilter(t, u, r);
            List<R> filteredObjects2 = other.applyFilter(t, u, r);
            finalList.addAll(filteredObjects1);
            finalList.addAll(filteredObjects2);
            return finalList;
       };
    }
}
 

Но, похоже, это выдает мне ошибку в этой строке: ‘return (T t, U u, List r) -> {‘

Комментарии:

1. Итак, ваш вопрос в основном звучит так: «Как мне создать список, содержащий элементы, которые существуют в двух других списках», верно? Что вы уже пробовали? Каким может быть алгоритм для этого?

2. @JBNizet Я добавил в вопрос то, что я пробовал.

Ответ №1:

кажется, это выдает мне ошибку

Это действительно выдает ошибку, в которой говорится:

 Error:(11, 16) java: incompatible types: incompatible parameter types in lambda expression. 
 

Эта ошибка вызвана тем фактом, что ваш метод использует необработанные типы вместо правильных универсальных типов. Это должно быть

 default TriFunctionInterface<T, U, R> or(TriFunctionInterface<T, U, R> other)
 

Комментарии:

1. Хорошо, так это значит, что я не могу использовать list в лямбда-аргументах? Тогда есть ли способ рассматривать R как список? потому что я использую методы списка в моем методе «или» на R.

2. Почему вы не могли. Просто замените объявление вашего метода (с использованием необработанных типов) на мое (без использования необработанных типов), и ваш код будет скомпилирован. Вам просто нужно скопировать и вставить.

3. Да, это так! Я думаю, я потрачу больше времени, чтобы понять концепции, стоящие за этим. Спасибо!