สมมติว่าฉันมีกระแสของสิ่งต่าง ๆ และฉันต้องการ "เพิ่มคุณค่า" พวกเขาให้อยู่กลางกระแสฉันสามารถใช้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/…