在我们的项目中,我们正在迁移到Java 8,并测试其新功能。
在我的项目中,我使用Guava predicates和functions来使用Collections2.transform
和Collections2.filter
过滤和转换一些集合。
在此迁移中,我需要将Guava代码更改为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());
使用guava,我非常舒适地调试代码,因为我可以调试每个转换过程,但我的担忧是如何调试例如 .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
映射到另一个int
,那么简单的int
也可以胜任。 - Holger