微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何编写涵盖尽可能多用例的通用 Java 功能接口?

如何解决如何编写涵盖尽可能多用例的通用 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 举报,一经查实,本站将立刻删除。