在我们的项目中,我们正在迁移到Java 8,并且正在测试它的新功能。
在我的项目中,我使用Guava谓词和函数使用Collections2.transform
和过滤和转换某些集合Collections2.filter
。
在此迁移中,我需要将番石榴代码更改为java 8更改。因此,我正在做的更改是:
List<Integer> naturals = Lists.newArrayList(1,2,3,4,5,6,7,8,9,10,11,12,13);
Function <Integer, Integer> duplicate = new Function<Integer, Integer>(){
@Override
public Integer apply(Integer n)
{
return n * 2;
}
};
Collection result = Collections2.transform(naturals, duplicate);
至...
List<Integer> result2 = naturals.stream()
.map(n -> n * 2)
.collect(Collectors.toList());
使用番石榴,我可以很轻松地调试代码,因为我可以调试每个转换过程,但是我关心的是例如如何调试 .map(n -> n*2)
。
使用调试器,我可以看到一些类似的代码:
@Hidden
@DontInline
/** Interpretively invoke this form on the given arguments. */
Object interpretWithArguments(Object... argumentValues) throws Throwable {
if (TRACE_INTERPRETER)
return interpretWithArgumentsTracing(argumentValues);
checkInvocationCounter();
assert(arityCheck(argumentValues));
Object[] values = Arrays.copyOf(argumentValues, names.length);
for (int i = argumentValues.length; i < values.length; i++) {
values[i] = interpretName(names[i], values);
}
return (result < 0) ? null : values[result];
}
但这并不像Guava调试代码那样直接,实际上我找不到 n * 2
转换。
有没有办法看到这种转换或有一种容易调试此代码的方式?
编辑:我添加了不同评论的答案并发布了答案
感谢Holger
回答了我的问题的评论,使用lambda块的方法使我能够看到转换过程并调试lambda主体内部发生的事情:
.map(
n -> {
Integer nr = n * 2;
return nr;
}
)
多亏有了Stuart Marks
方法引用的方法,我还可以调试转换过程:
static int timesTwo(int n) {
Integer result = n * 2;
return result;
}
...
List<Integer> result2 = naturals.stream()
.map(Java8Test::timesTwo)
.collect(Collectors.toList());
...
感谢Marlon Bernardes
回答,我注意到我的Eclipse没有显示应该显示的内容,并且peek()的使用有助于显示结果。
result
变量声明为Integer
。一个简单的int
,如果你是应该做的,以及map
平安int
到int
...