Как я могу приковать функциональные вызовы в Java?

Макс Zofal:

У меня есть два одинаковых кусков кода:

void task1() {
    init();
    while(someCondition) {
      doSomething();
    }
    shutdown();
  }
void task2() {
    while(someCondition) {
      init();
      doSomething();
      shutdown();
    }
  }

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

Function setup(Function f){
    init();
    f();
    shutdown();
}
Function loop(Function f){
    while(someCondition) {
      f();
    }
}

Тогда я хочу цепь это так:

void task1() {
   setup(loop(doSomething));
 }
void task2() {
    loop(setup(doSomething));
  }

Я думал / andThen создания сообщения в интерфейсе функции Java, но они не подходят, потому что они только руки от возвращаемого значения одной функции к следующему. Кто-нибудь есть идеи, как сделать это с помощью Java 8 или с другим подходом?

Sweeper:

Вы действительно можете сделать это. Вам нужно Runnable, а не Function, так как ваши методы не принимают никаких параметров и не возвращают никакого значения. Если ваши методы имеют разные подписи , хотя, вам нужно использовать другой тип.

public static void init() { ... }
public static void doSomething() { ... }
public static void shutdown() { ... }

public static Runnable setup(Runnable r) {
    return () -> {
        init();
        r.run();
        shutdown();
    };
}

public static Runnable loop(Runnable r) {
    return () -> {
        while (someCondition) {
            r.run();
        }
    };
}

// I used "Main" here because this in a class called Main. Replace "Main" with the name of your class
public static void task1() {
    setup(loop(Main::doSomething)).run();
}

public static void task2() {
    loop(setup(Main::doSomething)).run();
}

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

рекомендация

отhttp://10.200.1.11:23101/article/api/json?id=426568&siteId=1