"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Streams를 사용하여 Java에서 최대값과 최소값을 계산하는 방법은 무엇입니까?

Streams를 사용하여 Java에서 최대값과 최소값을 계산하는 방법은 무엇입니까?

2024년 11월 18일에 게시됨
검색:292

¿Cómo calcular el máximo y mínimo en Java usando Streams?

이 게시물에서는 Java Streams API를 사용하여 요소 모음의 최대값과 최소값을 계산하는 방법을 살펴보겠습니다. 이를 위해 Stream 클래스의 max() 및 min() 메서드를 사용하겠습니다. 이러한 방법을 사용하면 사용자 정의 비교기를 사용하여 요소 모음의 최대값과 최소값을 각각 얻을 수 있습니다.

Exam이 두 개의 속성 이름과 등급을 가진 레코드인 List 유형 목록이 있고 최고 등급과 최저 등급의 시험을 얻고 싶다고 가정합니다.

public record Exam(String name, Double grade) { }
var exams = Arrays.asList(
        new Exam("Alice", 9.5),
        new Exam("Bob", 6.0),
        new Exam("Charlie", 7.5),
        new Exam("David", 8.0),
        new Exam("Eve", 8.5)
);

최신 버전의 Java에서는 사용자 정의 비교기를 전달하고 결과와 함께 Optional을 가져옴으로써 이러한 목적으로 Stream 클래스의 max() 및 min() 메서드를 사용할 수 있습니다. Java 버전이 max() 및 min() 메소드를 지원하지 않는 경우 Collector를 매개변수(Collectors.maxBy() 또는 Collectors.minBy())로 전달하여 Collect() 메소드를 사용할 수 있습니다. 개인화된 비교기. 최신 버전의 Java에서 이 마지막 옵션을 사용하는 경우 IDE 자체에서 이를 max() 또는 min() 메서드로 변경할 것을 제안합니다.

오름차순으로 성적을 얻을 수 있는 Comparator 유형의 사용자 지정 비교기를 만드는 것부터 시작하겠습니다.

Comparator byGradeAsc = (e1, e2) -> (int) (e1.grade() - e2.grade());

예를 들어, 이 비교기는 첫 번째 시험의 성적이 두 번째 시험의 성적보다 낮으면 음수를 반환하고, 같으면 0을, 첫 번째 시험의 성적이 다음 시험의 성적보다 높으면 양수를 반환합니다. 두 번째로, 자세한 내용을 보려면 비교기 인터페이스 작동 방식을 설명하는 게시물에 대한 이 링크를 참조하세요.

이 비교기는 비교기를 수동으로 작성할 필요 없이 객체에서 double 값을 추출하는 함수에서 비교기를 생성할 수 있는 Comparator 클래스의 CompareDouble() 메서드를 사용하여 다른 방식으로 정의할 수 있습니다.

Comparator byGradeAscClean = Comparator.comparingDouble(Exam::grade);

이 정의에서 비교기는 Exam 유형의 객체를 가져와서 grade 속성 값을 추출하고 Double 데이터 유형을 사용하여 값을 비교해야 한다고 말합니다.

이 두 가지 방법은 동일하며 서로 바꿔서 사용할 수 있습니다. 두 번째 방법은 처음에는 이해하기가 조금 더 어려울 수 있지만 일단 이해하고 나면 작성하고 읽기가 더 쉽습니다.

이제 비교기가 있으므로 남은 것은 max() 및 min() 메서드에서 이를 사용하여 각각 최고 점수와 최저 점수를 얻은 시험을 얻는 것뿐입니다.

var highestGrade = exams.stream().max(byGradeAscClean);
var lowestGrade = exams.stream().min(byGradeAscClean);

이 경우, Optional은 각각 최고 점수와 최저 점수를 받은 시험으로 획득됩니다. 시험 목록이 비어 있는 경우 Optional.empty()가 반환됩니다. Optional의 값을 얻으려면 Consumer를 수신하고 값이 존재하는 경우 인수로 전달된 코드를 실행하는 ifPresent() 메서드를 사용할 수 있습니다.

highestGrade.ifPresent(ex -> System.out.println("Highest grade: "   ex.name()   " "   ex.grade()));
lowestGrade.ifPresent(ex -> System.out.println("Lowest grade: "   ex.name()   " "   ex.grade()));

// Output
Highest grade: Alice 9.5
Lowest grade: Bob 6.0

또는 단순히 참조 메서드를 인수로 전달하여 Optional 값을 인쇄합니다. Optional이 비어 있으면 아무 것도 인쇄되지 않습니다. 그렇지 않으면 Exam 개체의 toString() 메서드를 호출하여 Optional 값이 인쇄됩니다. .

highestGrade.ifPresent(System.out::println); lowerGrade.ifPresent(System.out::println); //산출 시험[이름=Alice, 성적=9.5] 시험[이름=Bob, 성적=6.0]
highestGrade.ifPresent(System.out::println);
lowestGrade.ifPresent(System.out::println);

// Output
Exam[name=Alice, grade=9.5]
Exam[name=Bob, grade=6.0]
이 방법으로 Java Streams API 및 Comparator 인터페이스를 사용하여 요소 컬렉션의 최대값과 최소값을 얻을 수 있습니다.

릴리스 선언문 이 기사는 https://dev.to/asjordi/como-calcular-el-maximo-y-minimo-en-java-usando-streams-2fca?1에 복제되어 있습니다. 침해가 있는 경우에는 Study_golang@163으로 문의하시기 바랍니다. .com에서 삭제하세요
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3