Trong dự án của chúng tôi, chúng tôi đang chuyển sang java 8 và chúng tôi đang thử nghiệm các tính năng mới của nó.
Trong dự án của mình, tôi đang sử dụng các chức năng và vị ngữ Guava để lọc và chuyển đổi một số bộ sưu tập bằng cách sử dụng Collections2.transform
và Collections2.filter
.
Trong lần di chuyển này, tôi cần thay đổi mã lệnh ví dụ ổi thành java 8 thay đổi. Vì vậy, những thay đổi tôi đang làm là:
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);
Đến...
List<Integer> result2 = naturals.stream()
.map(n -> n * 2)
.collect(Collectors.toList());
Sử dụng ổi, tôi rất có thể gỡ lỗi mã vì tôi có thể gỡ lỗi từng quá trình chuyển đổi nhưng mối quan tâm của tôi là làm thế nào để gỡ lỗi chẳng hạn .map(n -> n*2)
.
Sử dụng trình gỡ lỗi, tôi có thể thấy một số mã như:
@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];
}
Nhưng nó không đơn giản như Guava để gỡ lỗi mã, thực sự tôi không thể tìm thấy sự n * 2
chuyển đổi.
Có cách nào để xem sự chuyển đổi này hoặc một cách dễ dàng gỡ lỗi mã này không?
CHỈNH SỬA: Tôi đã thêm câu trả lời từ các nhận xét khác nhau và câu trả lời đã đăng
Cảm ơn Holger
nhận xét đã trả lời câu hỏi của tôi, phương pháp sử dụng khối lambda cho phép tôi xem quá trình chuyển đổi và gỡ lỗi những gì đã xảy ra bên trong thân lambda:
.map(
n -> {
Integer nr = n * 2;
return nr;
}
)
Nhờ Stuart Marks
cách tiếp cận có các tham chiếu phương thức cũng cho phép tôi gỡ lỗi quá trình chuyển đổi:
static int timesTwo(int n) {
Integer result = n * 2;
return result;
}
...
List<Integer> result2 = naturals.stream()
.map(Java8Test::timesTwo)
.collect(Collectors.toList());
...
Cảm ơn Marlon Bernardes
câu trả lời, tôi nhận thấy rằng Eclipse của tôi không hiển thị những gì nó nên và việc sử dụng peek () đã giúp hiển thị kết quả.
result
biến tạm thời của mình làInteger
. Một việc đơn giảnint
cũng nên làm nếu bạn đangmap
pingint
tới mộtint
…