จะหาค่าสูงสุดจาก Integer โดยใช้ stream ใน java 8 ได้อย่างไร?


93

ฉันมีรายการInteger listและจากlist.stream()ฉันต้องการค่าสูงสุด วิธีที่ง่ายที่สุดคืออะไร? ฉันต้องการตัวเปรียบเทียบหรือไม่?



15
คุณอาจมีเหตุผลในการใช้สตรีม แต่อย่าลืมCollections.max..
อเล็กซิสค.

คำตอบ:


205

คุณสามารถแปลงสตรีมเป็นIntStream:

OptionalInt max = list.stream().mapToInt(Integer::intValue).max();

หรือระบุตัวเปรียบเทียบลำดับธรรมชาติ:

Optional<Integer> max = list.stream().max(Comparator.naturalOrder());

หรือใช้การดำเนินการลด:

Optional<Integer> max = list.stream().reduce(Integer::max);

หรือใช้ตัวสะสม:

Optional<Integer> max = list.stream().collect(Collectors.maxBy(Comparator.naturalOrder()));

หรือใช้ IntSummaryStatistics:

int max = list.stream().collect(Collectors.summarizingInt(Integer::intValue)).getMax();

16
น่าสนใจที่จะทราบว่าอันไหนมีประสิทธิภาพมากกว่ากัน
Roland

2
ฉันขอถามว่าทำไม Tagir?
เลือกตั้ง

23
@ เลือกก่อนอื่นจะแกะกล่องจำนวนเต็มทั้งหมดจากนั้นเปรียบเทียบค่าที่ไม่ได้ใส่กล่อง โซลูชันที่ 2, 3 และ 4 ทำการแกะกล่องในแต่ละการเปรียบเทียบอย่างมีประสิทธิภาพโดยทำการแกะกล่องเป็นสองเท่า อันสุดท้ายคำนวณสถิติเพิ่มเติม (เช่น sum และ min) ซึ่งไม่จำเป็นที่นี่ แต่จะต้องใช้เวลาพอสมควร
Tagir Valeev

หากคุณต้องการเพียงแค่ได้รับintจากนั้นmapToInt(...).max().getAsInt()หรือ reduce(...).get()โซ่วิธีการ
Andrejs

1
@Bogdan สิ่งนี้สามารถแก้ไขได้แม้ว่าจะไม่จำเป็นในคำถามก็ตาม อย่างไรก็ตามคุณสามารถโพสต์คำตอบของคุณเองที่ครอบคลุมสถานการณ์นี้
Tagir Valeev

10
int max = list.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b));

8
วิธีนี้ใช้ได้ผลก็ต่อเมื่อค่าทั้งหมดของคุณเป็นบวก ใช้ Integer.MIN_VALUE แทน 0 ในการลด ()
rolika


3

รหัสที่ถูกต้อง:

int max = list.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b));

หรือ

int max = list.stream().reduce(Integer.MIN_VALUE, Integer::max);

0

พร้อมสตรีมและลด

Optional<Integer> max = list.stream().reduce(Math::max);

ดูเหมือนว่าคุณโพสต์คำตอบนี้สองครั้งและลบอีกอันหนึ่งออก แต่ขณะที่ฉันแสดงความคิดเห็นเกี่ยวกับอีกอันหนึ่งโซลูชันนี้รวมอยู่ในคำตอบของ Tagir แล้ว ( Integer::maxแต่ก็เหมือนกันทุกประการ)
Didier L

0

คุณยังสามารถใช้โค้ดด้านล่างที่ถูกตัดทอน:

int max = list.stream().max(Comparator.comparing(Integer::valueOf)).get();

ทางเลือกอื่น:

list.sort(Comparator.reverseOrder()); // max value will come first
int max = list.get(0);  

0
int value = list.stream().max(Integer::compareTo).get();
System.out.println("value  :"+value );

3
มีคำตอบอื่น ๆ ที่เป็นคำถามของ OP และถูกโพสต์เมื่อหลายปีก่อน เมื่อโพสต์คำตอบโปรดตรวจสอบให้แน่ใจว่าคุณได้เพิ่มโซลูชันใหม่หรือคำอธิบายที่ดีขึ้นมากโดยเฉพาะอย่างยิ่งเมื่อตอบคำถามเก่า ๆ
help-info.de

-2

คุณสามารถใช้ int max = Stream.of (1,2,3,4,5) .reduce (0, (a, b) -> Math.max (a, b)); ใช้ได้กับทั้งตัวเลขบวกและลบ


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