В нашем проекте мы переходим на java 8 и тестируем его новые функции.
В моем проекте я использую предикаты и функции Guava для фильтрации и преобразования некоторых коллекций с помощью 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());
Используя гуаву, мне было очень удобно отлаживать код, так как я мог отлаживать каждый процесс преобразования, но меня беспокоит, например, как отлаживать .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
комментарию, который ответил на мой вопрос, подход с использованием лямбда-блока позволил мне увидеть процесс преобразования и отладить то, что произошло внутри тела лямбда:
.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
…