làm thế nào để tìm giá trị lớn nhất từ ​​một Số nguyên bằng cách sử dụng luồng trong java 8?


93

Tôi có một danh sách từ Integer listlist.stream()tôi muốn giá trị lớn nhất. Cách đơn giản nhất là gì? Tôi có cần so sánh không?



15
Bạn có thể có lý do để sử dụng một Stream, nhưng đừng quên Collections.max..
Alexis C.

Câu trả lời:


205

Bạn có thể chuyển đổi luồng thành IntStream:

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

Hoặc chỉ định bộ so sánh thứ tự tự nhiên:

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

Hoặc sử dụng thao tác giảm:

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

Hoặc sử dụng bộ sưu tập:

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

Hoặc sử dụng IntSummarySt Statistics:

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

16
Sẽ rất thú vị khi biết cái nào hiệu quả hơn.
Roland

2
Tôi có thể hỏi tại sao không, Tagir?
chọn

23
@elect, trước tiên nó mở hộp tất cả các số nguyên, sau đó so sánh các số nguyên được mở hộp. Các giải pháp thứ 2, 3 và 4 thực hiện việc mở hộp trên mỗi phép so sánh có hiệu quả gấp đôi các hoạt động mở hộp. Cái cuối cùng tính toán nhiều thống kê hơn (như tổng và tối thiểu), điều này không cần thiết ở đây, nhưng chắc chắn sẽ mất một chút thời gian.
Tagir Valeev

Nếu bạn muốn chỉ nhận được một int, thì mapToInt(...).max().getAsInt()hoặc reduce(...).get()đến chuỗi phương pháp
Andrejs

1
@Bogdan, điều này có thể giải quyết được, mặc dù rõ ràng là không cần thiết. Tuy nhiên, bạn có thể đăng câu trả lời của riêng bạn về tình huống này.
Tagir Valeev

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

8
Điều này chỉ hoạt động nếu tất cả các giá trị của bạn là dương. Sử dụng Integer.MIN_VALUE thay vì 0 trong Reduce ().
rolika

3

Một phiên bản khác có thể là:

int maxUsingCollectorsReduce = list.stream().collect(Collectors.reducing(Integer::max)).get();

3

Mã chính xác:

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

hoặc là

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

0

Với luồng và giảm

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

Có vẻ như bạn đã đăng câu trả lời này hai lần và xóa câu trả lời kia, nhưng như tôi đã nhận xét về câu kia, giải pháp này đã được bao gồm trong câu trả lời của Tagir (với Integer::maxnhưng điều đó hoàn toàn giống nhau).
Didier L

0

Bạn cũng có thể sử dụng mã được cắt bên dưới:

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

Một thay thế khác:

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
Có những câu trả lời khác cung cấp câu hỏi của OP, và chúng đã được đăng cách đây nhiều năm. Khi đăng câu trả lời, vui lòng đảm bảo bạn thêm giải pháp mới hoặc giải thích về cơ bản tốt hơn, đặc biệt là khi trả lời các câu hỏi cũ hơn.
help-info.de

-2

Bạn có thể sử dụng int max = Stream.of (1,2,3,4,5) .reduce (0, (a, b) -> Math.max (a, b)); hoạt động cho cả số dương và số âm


Bạn nên bắt đầu từ Integer.MIN_VALUEđể làm cho nó hoạt động với số âm.
Didier L
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.