如何使用 java 8 创建抽象函数

How to create abstract Function using java 8

我正在尝试使用 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>声明为抽象方法。

你可以只声明一个常规的抽象方法,它接受一个 Integer 和 returns 一个 Integer 并使用方法引用语法来引用它:

public abstract Integer overridden(Integer input);

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

字段不受多态性影响——您需要一种方法。你要么写

  1. 一个方法,只是returns一个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
  }
}