Как создать абстрактную функцию, используя java 8 - PullRequest
3 голосов
/ 29 марта 2020

Я пытаюсь реализовать шаблон проектирования трубопровода, используя Java 8 со следующей статьей для моей справки:

{ ссылка }

Код:

public abstract class Pipeline{
Function<Integer, Integer> addOne = it -> {
        System.out.println(it + 1);
        return it + 1;
    };

Function<Integer, Integer> addTwo = it -> {
        System.out.println(it + 2);
        return it + 2;
    };

Function<Integer, Integer> timesTwo = input -> {
        System.out.println(input * 2);
        return input * 2;
    };

final Function<Integer, Integer> pipe = sourceInt
    .andThen(timesTwo)
    .andThen(addOne)
    .andThen(addTwo);
}

Я пытаюсь добавить один абстрактный метод и хочу переопределить его. Я пытаюсь сделать что-то вроде:

abstract BiFunction<Integer, Integer,Integer> overriden; 

и изменить канал на:

final Function<Integer, Integer> pipe = sourceInt
    .andThen(timesTwo)
    .andThen(overriden)
    .andThen(addOne)
    .andThen(addTwo);
}

Но проблема в том, что я не знаю, объявить Function<Integer, Integer> как абстрактный метод.

Ответы [ 2 ]

4 голосов
/ 29 марта 2020

Вы можете просто объявить обычный абстрактный метод, который принимает Integer и возвращает Integer и использует синтаксис ссылки на метод для ссылки на него:

public abstract Integer overridden(Integer input);

final Function<Integer, Integer> pipe = sourceInt
    .andThen(timesTwo)
    .andThen(this::overridden)
    .andThen(addOne)
    .andThen(addTwo);
2 голосов
/ 29 марта 2020

Поля не подвержены полиморфизму - вам нужен метод. Вы либо пишете

  1. метод, который просто возвращает Function<Integer, Integer> экземпляр

    public abstract Function<Integer, Integer> getMyFunction();
    
  2. метод, который фактически представляет Function<Integer, Integer>

    public abstract Integer myFunction(Integer i);
    

и затем

.andThen(getMyFunction())

или

.andThen(i -> myFunction(i))
// .andThen(this::myFunction) // fancier

соответственно.

Например,

interface I {
  Function<Integer, Integer> getFunction();
  Integer function(Integer i);
}

class A implements I {
  @Override
  public Function<Integer, Integer> getFunction() {
    return i -> i + 1;
  }

  @Override
  public Integer function(Integer i) {
    return i + 1;
  }
}

class B implements I {
  @Override
  public Function<Integer, Integer> getFunction() {
    return i -> i * 2;
  }

  @Override
  public Integer function(Integer i) {
    return i * 2;
  }
}

class T {
  public static void main(String[] args) {
    A a = new A();
    B b = new B();

    Function<Integer, Integer> f1 = a.getFunction().andThen(b.getFunction());
    System.out.println(f1.apply(2)); // 6

    Function<Integer, Integer> f2 = a.getFunction().andThen(b::function);
    System.out.println(f2.apply(2)); // 6

    Function<Integer, Integer> f3 = ((Function<Integer, Integer>)a::function).andThen(b::function);
    System.out.println(f3.apply(2)); // 6
  }
}
...