干涸java(lambda函数?)

干涸java(lambda函数?),java,lambda,dry,Java,Lambda,Dry,我正在用java编写一个程序,它基本上测试了很多东西 对于每个调用,我都需要检查NullPointerExceptions,StackOverflow,IndexOutOfBounds,等等 我现在在每个方法中都有这种重复模式: try { doSomething(); } catch(NullPointerExceptions npe) { // prints something } catch(StackOverflow soe) { // prints something }

我正在用java编写一个程序,它基本上测试了很多东西

对于每个调用,我都需要检查
NullPointerExceptions
StackOverflow
IndexOutOfBounds
,等等

我现在在每个方法中都有这种重复模式:

try {
  doSomething();
} catch(NullPointerExceptions npe) {
  // prints something
} catch(StackOverflow soe) {
  // prints something
} catch(IndexOutOfBounds iob) {
  // prints something
}
因为我可以在一个方法中多次调用
doSomething()
(使用不同的参数),所以我不能将异常
抛出到main(因为我需要实际运行下一个测试)

我想编写一个lambda测试程序,我可以将函数传递给它,但我找不到一种方法来使用java:(

我想做一些类似的事情:

private void test(Method m, E expectedValue) {
  try {
    if(!m.run().equals(expectedValue))
      System.out.println("FAILED TEST: "+m.name()+". Value was "+m.run()+", should have been "+expectedValue);
  } catch() {
    // see above
  }
}

在Java中,最好使用接口:

interface DoSomething<E extends Comparable<E>> {
  E doSomething();
}
E
需要扩展
Comparable
,因为您正在
测试的内部调用
equals

这称为SAM(单一抽象方法)接口。使用SAM类和接口来模拟lambdas在Java中很常见。我甚至听说它们被称为“SAMbdas”

编辑:我的解决方案不一定涉及修改现有类:

DoSomething foo = new DoSomething<String>() {
     public String doSomething() { return "Hello World"; }
};
test(foo, "Hello World");
DoSomething foo=新的DoSomething(){
公共字符串doSomething(){返回“Hello World”;}
};
测试(foo,“你好世界”);
可能是这样的:

private void test(DoSomething<E> m, E expectedValue) {
  try {
    if(!m.doSomething().equals(expectedValue))
      System.out.println("FAILED TEST");
  } catch() {
    //handle exception
  }
}
abstract class Method<R> {
     public R run();
}


test(new Method<Result1>() {
         public Result1 run() { .... }
     }, expectedResult);
抽象类方法{
公共R-run();
}
测试(新方法){
public Result1 run(){….}
},预期成绩);

如果您想自己编写,而不是JUnit,可以使用反射来调用该方法

因此,不要说
m.run()
,而是使用
java.lang.reflect.Method#invoke

try { method.invoke(obj, arg1, arg2,...); } catch (Exception e) { // there are several Reflection exceptions you also need to deal with } 试一试{ 调用(obj,arg1,arg2,…); }捕获(例外e){ //您还需要处理几个反射异常 }
Lambda将以自己的方式进入JDK7。如果您想尝试,请从Oracle获得一个早期的access版本

也就是说,我不太理解这个问题。你能举一个例子说明你打算如何使用所有这些方法吗?你建议的方法听起来似乎是正确的,试试:

private void test(Method m, Object target, Object[] args, E expectedValue) {
  try {
    if(!m.invoke(target, args).equals(expectedValue))
      System.out.println("FAILED TEST: "+m.name()+". Value was "+m.run()+", should have been "+expectedValue);
  } catch() {
    // see above
  }
}

不过,Gus Bosman是对的。像JUnit这样的单元测试框架可能会有很大帮助。

很遗憾,Lambda还没有出现在java中。但您可以使用通用的java.util.concurrent.Callable:

private <T> void test(Callable<T> c, T expectedValue) {
      try {
        if(!c.call().equals(expectedValue))
          System.out.println("FAILED TEST: "+c+". Value was "+c.call()+", should have been "+expectedValue);
      } catch(Exception ex) {
        // see above
      }
    }
private void测试(可调用c,T expectedValue){
试一试{
如果(!c.call().equals(expectedValue))
System.out.println(“测试失败:“+c+”。值为“+c.call()+”,应为“+expectedValue”);
}捕获(例外情况除外){
//见上文
}
}

您可以使用JUnit吗?这或多或少对您有帮助。不,JUnit在这种情况下是不可行的,否则我会使用它……我不明白这个问题。而且也不明白为什么JUnit不合适。当您使用JUnit时,您还应该捕获算术异常、OutOfMemoryError、IllegalArgumentException、肯定是ClassCastException,甚至可能是一个ConcurrentModificationException。或者你可以只使用一个测试框架…可比的或可比的?或者只是可比的?在Ingo的答案
可比的
,在我的答案
可比的
;)中,JUnit并不是专门用于你的机器的。例如,我正在使用它图诺。。。我不能使用JUnit实现这一点,但我也不能使用预发布的java,因为它在多个MachineSlambda上运行,而不会进入JavaSE7。可能在SE 8中。但这有一个缺点,即必须修改现有类(即实现DoSomething),这并不总是可能的(或可取的)。@Ingo我不同意。您可以以与解决方案类似的方式使用匿名内部类。请看我的编辑。@dbyme-事实上,我是正确的。看起来你应该得到+1.:)