Аргументы уровня функционального класса в Java 8 - PullRequest
0 голосов
/ 11 ноября 2018

Я хотел бы приложить больше усилий, чтобы использовать функциональные возможности Java 8 и перевести мое мышление в сторону этой парадигмы; однако я не совсем уверен, как согласовать этот сценарий.

Например, недавно я написал что-то похожее на это:

public class ExampleClass {

    private ExampleData exampleData;
    private Function<ExampleData, Boolean> workFunction;

    public ExampleData getExampeData() {
        return exampleData;
    }

    public void setExampleData(ExampleData exampleData) {
        this.exampleData = exampleData;
    }

    public Function<ExampleData, Boolean> getWorkFunction() {
        return workFunction;
    }

    public void setWorkFunction(Function<ExampleData, Boolean> workFunction) {
        this.workFunction = workFunction;
    }
}

тогда я продолжаю использовать его так ...

public class Worker implements Callable {

    private final ExampleClass exampleClass;

    // ExampleClass serves as a container for the function and it's
    // input data in order to minimize the number of arguments
    // passed to this constructor. Otherwise would be
    // public Worker(ExampleData exampleData, Function<T, R> workFunction, ...) {
    // Note: using "..." here to represent more args.
    public Worker(ExampleClass exampleClass, ...) {
        this.exampleClass = exampleClass;
        ...
    }

    @Override
    public void call() {
        final Boolean isComplete = exampleClass.getWorkFunction().apply(exampleClass.getExampleData());
        if (isComplete) {
            ...
        }
        ...
    }
}

Будет ли что-то подобное выше предпочтительнее, чем то, что я считаю более традиционным подходом?

public class ExampleClass {

    private ExampleData exampleData;

    public ExampleClass(ExampleData exampleData) {
        this.exampleData = exampleData;
    }

    public Boolean work() {
          return isComplete(exampleData);
    }
}

и реализующий класс ...

public class Worker implements Callable {

    private ExampleClass exampleClass;

    public Worker(ExampleClass exampleClass, ...) {
        this.exampleClass = exampleClass;
        ...
    }

    @Override
    public void call() {
        final Boolean isComplete = exampleClass.work();
        if (isComplete) {
            ...
        }
        ...
    }
}

Если я совершенно не в себе, что будет правильным функциональным решением с использованием Java 8?

Обновление: Допустим, мой пример не возвращает логическое значение. В контексте функционального программирования с Java 8, лучше ли явно передавать функцию в качестве аргумента уровня класса или лучше просто использовать традиционный объектно-ориентированный способ просто передать другой класс, который выполняет эту функцию?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Смысл функционального программирования заключается в том, что функция должна рассматриваться как объект.

но вы знаете, функция (метод) не является объектом в Java. это отличается от JavaScript.

Итак, мы должны использовать интерфейс под названием Predicate.

List<Apple> apples = new ArrayList<>();

хочешь вес яблок набрать. первоначально,

List<Apple> weightApples = new ArrayList<>();
for(int i = 0; 9< apples.size(); i++){
    if(apples.getWeight() > 10){
        weightApples.add(apples.get(i));
    }
}

этот код.

в функциональном программировании, функция будет «чистой функцией».

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

и нас не волнует логика функции в «строке с использованием функции»

сначала нам нужен интерфейс предиката.

interface Predicate<T>{
    public boolean pass(T t);
}

в общем случае мы можем расширить тип объекта.

мы можем сделать фильтр.

public static <T> List<T> filter(List<T> list, Predicate<T> predicate){
    List<T> result = new ArrayList<>();
    for(T el : list){
        if(predicate.pass(el)){
            result.add(el);
        }
    }

    return result;
}

pass () еще не реализован.

это может быть реализовано анонимным классом.

наконец, метод обрабатывается как объект, используя lamda!

filter(apples, (Apple apple) -> apple.getWeight()>10);

Я не человек по-английски, так что это плохой английский.

но я надеюсь, что это полезно для вас! спасибо.

0 голосов
/ 11 ноября 2018

Прежде всего, функция, которая принимает один аргумент и возвращает логическое значение, должна реализовывать Java 8 Predicate.

Однако, по моему мнению, предикаты не должны были заменить никакие и все if утверждения. Они предназначены для использования в качестве фильтров в потоках коллекций Java 8. Приведенный вами пример, похоже, не подходит к этой ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...