ฉันจะข้ามการ จำกัด การโทร (หมายเลข) ด้วยสตรีมได้อย่างไรเมื่อจำนวนเท่ากับ 0


19

ฉันมีบางรหัส Java itemsที่ให้วัตถุจาก มัน จำกัด พวกเขาตามmaxNumber:

items.stream()
     .map(this::myMapper)
     .filter(item -> item != null)
     .limit(maxNumber)
     .collect(Collectors.toList());

มันทำงานได้ดี แต่คำถามคือ: มีวิธีการข้ามข้อ จำกัด เมื่อmaxNumber == 0?

ฉันรู้ว่าฉันสามารถทำสิ่งนี้:

if (maxNumber == 0) {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .collect(Collectors.toList());
} else {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .limit(maxNumber)
         .collect(Collectors.toList());
}

แต่บางทีอาจจะมีวิธีที่ดีกว่าไม่มีอะไรในใจของคุณ?

คำตอบ:


15

ฉันคิดว่า

.limit(maxNumber == 0 ? Long.MAX_VALUE : maxNumber)

จะทำเคล็ดลับเนื่องจากมันไม่น่าเป็นไปได้สูงที่คุณจะจัดการกระแสที่มีองค์ประกอบมากกว่า 2 ^ 63-1 ...

อย่างน้อยต้องระวังลำธารคู่ขนานบนสิ่งนี้ ... โน้ตในเอกสาร API พูดว่า:

API หมายเหตุ : แม้ว่าlimit()โดยทั่วไปแล้วจะเป็นการดำเนินการที่ถูกในท่อส่งกระแสข้อมูลแบบต่อเนื่องแต่อาจมีราคาแพงมากเมื่อสั่งซื้อท่อแบบขนานโดยเฉพาะอย่างยิ่งสำหรับค่า maxSize ขนาดใหญ่ ...


ใช่นั่นเป็นกลอุบายขอบคุณ!
randomuser1

20

ไม่มีท่อสตรีมไม่อนุญาตให้จริงข้ามไปรอบ ๆ ส่วนหนึ่งของท่อใด ๆ ดังนั้นคุณถูกบังคับให้ทำงานกับทั้งตรรกะเงื่อนไขภายในขั้นตอนและรวมถึงlimit()เสมอในท่อหรือการสร้างกระแสในส่วนซึ่งจะเป็น ค่อนข้างชัดเจน (IMHO) มากกว่า if / else ในคำถาม

Stream<Item> s = items.stream()
         .map(this::myMapper)
         .filter(Objects::nonNull);

if(maxNumber > 0) {
    s = s.limit(maxNumber);
}

List<Item> l = s.collect(Collectors.toList());

ในกรณีที่เรียบง่ายเช่นที่นี่มันไม่ได้สร้างความแตกต่างมากนัก แต่คุณมักจะเห็นว่าในคอลเลกชันรหัสปกติถูกส่งผ่านวิธีการแปลงเป็นสตรีมแล้วกลับไปที่คอลเลกชัน collect()ในกรณีดังกล่าวก็อาจจะมีความคิดที่ดีในการทำงานกับกระแสในส่วนจนกว่าคุณต้องการจริงๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.