如何使用 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);
字段不受多态性影响——您需要一种方法。你要么写
一个方法,只是returns一个Function<Integer, Integer>
实例
public abstract Function<Integer, Integer> getMyFunction();
一个实际代表一个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
}
}
我正在尝试使用 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);
字段不受多态性影响——您需要一种方法。你要么写
一个方法,只是returns一个
Function<Integer, Integer>
实例public abstract Function<Integer, Integer> getMyFunction();
一个实际代表一个
的方法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
}
}