ในโครงการของเราเรากำลังย้ายไปที่ java 8 และเรากำลังทดสอบคุณสมบัติใหม่ของมัน
ในโครงการของฉันฉันใช้ภาคฝรั่งและฟังก์ชั่นในการกรองและการแปลงคอลเลกชันโดยใช้และCollections2.transform
Collections2.filter
ในการย้ายข้อมูลนี้ฉันจำเป็นต้องเปลี่ยนเช่น guava code เป็น 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];
}
แต่มันไม่ตรงไปตรงมาเหมือนฝรั่งในการดีบักโค้ดจริงๆแล้วฉันไม่พบการ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
pingint
ไปที่int
...