У нашому проекті ми переходимо на 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());
Використовуючи 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
перетворення.
Чи є спосіб побачити цю трансформацію чи спосіб легкої налагодження цього коду?
EDIT: Я додав відповіді з різних коментарів і опублікував відповіді
Завдяки 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
…