如何解决如何编写涵盖尽可能多用例的通用 Java 功能接口?
有很多Java core functional interfaces。
我经常需要用不同的参数稍作改动,例如对于具有自定义事件类型的自定义侦听器,并且没有一个核心类适合。
可能的用例,包括生产者、消费者、监听者、处理者、策略、委托等。
由最新的 Java Magazine quiz about functional interfaces 触发。 Previous attempt 在我能够编辑之前已删除。
解决方法
当然你可以编写自己的函数式接口,尽管尽可能多的几乎是无限的(受源和代码文件的大小限制!)
功能接口在 JLS 9.8 中指定 - 基本上是带有单个抽象方法的 interface
。
但我会尽量坚持使用 java.util.function
包中的标准接口(也是如何实现其他接口的示例的好来源。)
几年前,我创建了这组具有零到三个参数的通用函数式接口,有和没有返回值。自 Java 8 以来,它涵盖了我 99% 的用例。
/**
* Functional Interfaces
*/
public class Functions {
/** 0 args,with return value */
@FunctionalInterface
public static interface Func0R<RETURN> {
public RETURN run() throws Exception;
default public RETURN runNoEx() {
try {
return run();
}
catch(Exception e) {
throw e instanceof RuntimeException ? (RuntimeException) e : new RuntimeException(e);
}
}
}
/** 1 args,with return value */
@FunctionalInterface
public static interface Func1R<ARG1,RETURN> {
public RETURN run(ARG1 arg1) throws Exception;
default public RETURN runNoEx(ARG1 arg1) {
try {
return run(arg1);
}
catch(Exception e) {
throw e instanceof RuntimeException ? (RuntimeException) e : new RuntimeException(e);
}
}
}
/** 2 args,with return value */
@FunctionalInterface
public static interface Func2R<ARG1,ARG2,RETURN> {
public RETURN run(ARG1 arg1,ARG2 arg2) throws Exception;
default public RETURN runNoEx(ARG1 arg1,ARG2 arg2) {
try {
return run(arg1,arg2);
}
catch(Exception e) {
throw e instanceof RuntimeException ? (RuntimeException) e : new RuntimeException(e);
}
}
}
/** 3 args,with return value */
@FunctionalInterface
public static interface Func3R<ARG1,ARG3,ARG2 arg2,ARG3 arg3) throws Exception;
default public RETURN runNoEx(ARG1 arg1,ARG3 arg3) {
try {
return run(arg1,arg2,arg3);
}
catch(Exception e) {
throw e instanceof RuntimeException ? (RuntimeException) e : new RuntimeException(e);
}
}
}
/** 0 args,no return value (void) */
@FunctionalInterface
public interface Func0V {
public void run() throws Exception;
default public void runNoEx() {
try {
run();
}
catch(Exception e) {
throw e instanceof RuntimeException ? (RuntimeException) e : new RuntimeException(e);
}
}
}
/** 1 args,no return value (void) */
@FunctionalInterface
public static interface Func1V<ARG1> {
public void run(ARG1 arg1) throws Exception;
default public void runNoEx(ARG1 arg1) {
try {
run(arg1);
}
catch(Exception e) {
throw e instanceof RuntimeException ? (RuntimeException) e : new RuntimeException(e);
}
}
}
/** 2 args,no return value (void) */
@FunctionalInterface
public static interface Func2V<ARG1,ARG2> {
public void run(ARG1 arg1,ARG2 arg2) throws Exception;
default public void runNoEx(ARG1 arg1,ARG2 arg2) {
try {
run(arg1,no return value (void) */
@FunctionalInterface
public static interface Func3V<ARG1,ARG3> {
public void run(ARG1 arg1,ARG3 arg3) throws Exception;
default public void runNoEx(ARG1 arg1,ARG3 arg3) {
try {
run(arg1,arg3);
}
catch(Exception e) {
throw e instanceof RuntimeException ? (RuntimeException) e : new RuntimeException(e);
}
}
}
}
示例用法:
public class Component {
private Func1R<Component,Integer> strategy;
public void setStrategy(Func1R<Component,Integer> strategy) {
this.strategy = strategy;
}
public void calc() {
int result = this.strategy.runNoEx(this);
// ...
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。