Java 8에서 스트림을 사용하여 정수에서 최대 값을 찾는 방법은 무엇입니까?


93

나는 목록을 가지고 Integer list와에서 list.stream()나는 최대 값을합니다. 가장 간단한 방법은 무엇입니까? 비교기가 필요합니까?



15
당신은 스트림을 사용하도록 이유가있을 수 있지만, 잊지 마세요 Collections.max..
알렉시스 C.에게

답변:


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
@elect, 먼저 모든 정수를 unboxing 한 다음 unboxed 정수를 비교합니다. 두 번째, 세 번째 및 네 번째 솔루션은 각 비교에서 unboxing을 수행하여 두 배의 unboxing 작업을 효과적으로 수행합니다. 마지막 항목은 여기에서 필요하지 않은 더 많은 통계 (예 : 합계 및 최소값)를 계산하지만 확실히 시간이 걸립니다.
Tagir Valeev

당신은 단지를 얻고 싶다면 int다음, mapToInt(...).max().getAsInt()또는 reduce(...).get()메소드 체인에
안드레이

1
@Bogdan, 이것은 분명히 문제에서 필요하지 않았지만 해결할 수 있습니다. 그럼에도 불구하고이 상황을 다루는 자신의 답변을 게시 할 수 있습니다.
Tagir Valeev

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

8
이것은 모든 가치가 양수인 경우에만 작동합니다. reduce ()에서 0 대신 Integer.MIN_VALUE를 사용하십시오.
rolika 2011


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.