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