สมมติว่าฉันมีกระแสของสิ่งต่าง ๆ และฉันต้องการ "เพิ่มคุณค่า" พวกเขาให้อยู่กลางกระแสฉันสามารถใช้peek()
ทำสิ่งนี้ได้เช่น:
streamOfThings.peek(this::thingMutator).forEach(this::someConsumer);
สมมติว่าการกลายพันธุ์สิ่งต่าง ๆ ณ จุดนี้ในรหัสเป็นการทำงานที่ถูกต้องตัวอย่างเช่นthingMutator
วิธีการอาจตั้งค่าฟิลด์ "lastProcessed" เป็นเวลาปัจจุบัน
อย่างไรก็ตามpeek()
ในบริบทส่วนใหญ่หมายถึง "มอง แต่ไม่ได้สัมผัส"
ใช้peek()
เพื่อเปลี่ยนแปลงองค์ประกอบของกระแสข้อมูลที่เป็น antipattern หรือไม่เหมาะสมหรือไม่?
แก้ไข:
ทางเลือกที่ธรรมดากว่าคือการเปลี่ยนผู้บริโภค:
private void thingMutator(Thing thing) {
thing.setLastProcessed(System.currentTimeMillis());
}
ไปที่ฟังก์ชันที่คืนค่าพารามิเตอร์:
private Thing thingMutator(Thing thing) {
thing.setLastProcessed(currentTimeMillis());
return thing;
}
และใช้map()
แทน:
stream.map(this::thingMutator)...
แต่ที่แนะนำรหัสลวก ๆ (คนreturn
) และฉันไม่ได้เชื่อว่ามันเป็นที่ชัดเจนเพราะคุณรู้ว่าpeek()
ผลตอบแทนที่วัตถุเดียวกัน แต่map()
มันไม่ได้ล้างได้อย่างรวดเร็วว่ามันเป็นเดียวกันระดับของวัตถุ
นอกจากนี้peek()
คุณยังสามารถมีแลมบ์ดาที่กลายพันธุ์ได้ แต่map()
คุณต้องสร้างซากรถไฟ เปรียบเทียบ:
stream.peek(t -> t.setLastProcessed(currentTimeMillis())).forEach(...)
stream.map(t -> {t.setLastProcessed(currentTimeMillis()); return t;}).forEach(...)
ฉันคิดว่าpeek()
เวอร์ชั่นนั้นชัดเจนและแลมบ์ดากำลังกลายพันธุ์อย่างชัดเจนดังนั้นจึงไม่มีผลข้างเคียง "ลึกลับ" ในทำนองเดียวกันหากมีการใช้การอ้างอิงวิธีการและชื่อของวิธีการกลายพันธุ์โดยนัยอย่างชัดเจนก็ชัดเจนและชัดเจน
ในบันทึกส่วนตัวฉันไม่อายที่peek()
จะกลายพันธุ์ - ฉันคิดว่ามันสะดวกมาก
peek
กับสตรีมที่สร้างองค์ประกอบแบบไดนามิกหรือไม่ มันยังคงทำงานหรือการเปลี่ยนแปลงที่หายไป? การดัดแปลงองค์ประกอบของสตรีมนั้นไม่น่าเชื่อถือสำหรับฉัน
List<Thing> list; things.stream().peek(list::add).forEach(...);
มีประโยชน์มาก เมื่อเร็ว ๆ นี้. ฉันใช้มันเพื่อเพิ่มข้อมูลสำหรับการเผยแพร่: Map<Thing, Long> timestamps = ...; return things.stream().peek(t -> t.setTimestamp(timestamp.get(t))).collect(toList());
. ฉันรู้ว่ามีวิธีอื่นในการทำตัวอย่างนี้ แต่ฉันทำสิ่งที่ทำให้เข้าใจง่ายเกินไปอย่างมากที่นี่ การใช้peek()
จะสร้างรหัสที่กะทัดรัดและสวยงามยิ่งขึ้น IMHO คำถามนี้เป็นเรื่องเกี่ยวกับสิ่งที่คุณยกขึ้นมา ปลอดภัย / เชื่อถือได้หรือไม่
peek
หรือไม่? ฉันมีคำถามที่คล้ายกันใน stackoverflow และหวังว่าคุณจะสามารถดูและให้ข้อเสนอแนะของคุณ ขอบคุณ stackoverflow.com/questions/47356992/…