Lambdas를 사용하여 Java에서 간단한 컬렉션 작업 수행

10770 단어 lambdajava8java
자바 8에 도입된 가장 강력한 기능 중 하나는 Lambda이다. 처음에는 많지 않을 수도 있지만, 올바르게 사용하면 많은 경우 인코딩과 실행 속도가 빨라진다.여기서 Java의 스트림 및 Lambda 표현식 기능을 검토하고 이를 사용하여 컬렉션을 조작합니다.이것은 결코 고급 강좌가 아니라 이 기능에 대한 소개이다.종점에 도착했을 때 새로운 정보가 공유되기를 바랍니다.

초급반
우리는 간단한 반부터 학생들을 위해 이름, 나이, 점수를 저장할 것이다.이것은 뒤의 예시에서 우리에게 도움이 될 것이다.
public class Student {
    private String name;
    private double gradeAtMath;
    private double gradeAtEnglish;
    private int age;
    public boolean passed() {
        return (gradeAtMath + gradeAtEnglish) / 2 >= 5;
    }
    // Getters and Setters
}

시냇물Java의 Filter()
우리 간단한 일부터 시작합시다.우리는 대학의 학생들을 저장하기 위한 집합이 있습니다.지금, 우리는 그 이름이 자모 "M"으로 시작하는 사람들을 추출하고 싶다
List<Body> filtered= students.stream()
        .filter(s -> s.getName().toUpperCase(Locale.ROOT).startsWith("M"))
        .collect(Collectors.toList());
분석해 봅시다.우선, 우리는 집합에서 하나의 흐름을 만들 것이다.다음에 우리는 Filter () 를 사용하여 학생들의 이름을 가져오고 대문자로 설정하며 'M' 으로 시작하는지 확인하는 Lambda 표현식을 제공합니다.마지막으로, 우리는 새로운 목록에서 결과를 수집한다.
처음에는 우리가 더 전통적인 방법으로 똑같은 효과를 거둘 수 있기 때문에 많지 않은 것 같았지만, 우리는 이제 막 시작되었다.우리는 대형 모호한 문장을 작성하지 않고 더 복잡한 작업을 수행하기 위해 여러 개의 필터를 연결할 수 있다.
List<Student> filtered = students.stream()
        .filter(s -> s.getName().toUpperCase(Locale.ROOT).startsWith("M"))
        .filter(s -> s.getGradeAtMath() >= 5)
        .filter(s -> s.getGradeAtEnglish() < 5)
        .filter(Student::passed)
        .collect(Collectors.toList());
여기에서, 우리는 우리가 찾고 있는 정확한 결과를 얻기 위해 여러 필터를 연결합니다.흥미로운 예는 마지막 필터입니다. 흥미로운 값을 되돌려 주는 방법을 지정하기만 하면 됩니다. 이 예에서 만약 그가 연도를 통과한다면.

여러 개의 Filter () 호출이 더 높은 실행 시간을 가져올까요?
이 질문은 여러 번 받았는데, 언뜻 보기에는 여러 개의 Filter () 호출을 실행하는 것이 효율이 떨어지는 것 같다.그러나 항상 그렇지는 않다.사용한 술어에 따라 컴파일러와 JVM은 최적화되어 동일하거나 더 좋은 실행 시간을 얻을 수 있다.흐름에 대해 두 번 Filter () 를 호출하는 것은 첫 번째 호출이 원시 집합에서 실행되고, 두 번째 호출이 결과 집합에서 실행되는 것을 의미하지 않기 때문이다.중간과 단말기 조작을 갖춘 여러 개의 파이프가 흐른다.파이프의 터미널 동작을 실행하기 전에 파이프 원본을 옮겨다니기 시작하지 않습니다.
더 빠른 실행을 보장하기 위해 가능한 한 방법 인용을 사용하는 것이 lambda 표현식이 아니라 최적화를 할 수 있습니다.만약 우리가 사용한다면.필터(Student::passed)는 생성된 객체가 작성된 객체보다 적습니다.필터(s->s.passed())는 실행 시간을 단축합니다.
대부분의 경우, 복잡한 술어와 링크된 여러 개의 필터 호출 (모든 필터 호출은 간단한 술어가 있음) 사이의 실행 시간 차이는 무시할 수 있다.나의 건의는 더 쉽게 읽고 이해할 수 있는 것을 선택하는 것이다.

시냇물정렬()
또 다른 유용한 기능은 집합을 정렬하는 것이다.이것은sort() 방법을 통해 이루어진 것으로 Filter()처럼 우리는 Lambda 표현식을 사용하여 우리의 업무를 간소화할 수 있다.다음은 이름에 따라 학생들을 정렬할 것입니다.이 두 가지 예는 모두 같은 일을 했지만, 나는 Lambdas와comparator를 사용하여 더 깨끗한 코드를 실현하는 방법을 보여 주었다.
List<Student> sorted = students.stream()
        .sorted((s1, s2) -> s1.getName().compareTo(s2.getName()))
        .collect(Collectors.toList());
List<Students> sorted= students.stream()
        .sorted(Comparator.comparing(Student::getName))
        .collect(Collectors.toList());
두 번째 예시에서 getName () 방법을 비교하는 데 사용할 비교기를 제공합니다.
정렬 기능의 강점은 Comparator 클래스에 있습니다.학생이 동명이인 경우는 드물지 않기 때문에 이름순으로 정렬할 때 수학 성적이 가장 높은 사람이 동명이인 앞에 서기를 원한다고 가정하자.더욱 전통적인 메커니즘에서, 이것은 상당히 복잡한 임무가 될 것이다. 특히 우리가 더 많은 기준을 원한다면.자바 8에서는 비교기의 강력한 기능을 빌려 여러 비교기를 연결하고sort() 함수에 결과를 적용함으로써 이를 쉽게 실현할 수 있다.| NAME | Grade at math | Grade at English | Age | +------+---------------+------------------+------+ |Tom | 8 | 7 | 3 | |Jerry | 9 | 5 | 2 | |Spike | 7 | 9 | 4 | |Tom | 7 | 7 | 3 |비밀번호
List<Students> students = getAllStudents();
Comparator<Student> comparator = Comparator.comparing(Student::getName)
        .thenComparing(Student::getGradeAtMath);
students.stream().sorted(comparator);
출력:| NAME | Grade at math | Grade at English | Age | +------+---------------+------------------+------+ |Jerry | 9 | 5 | 2 | |Spike | 7 | 9 | 4 | |Tom | 8 | 7 | 3 | |Tom | 7 | 7 | 3 |우리는 필요에 따라 임의의 여러 함수를 호출할 수 있다.현실 생활에서 우리는 많은 데이터를 가지고 있기 때문에 두 개 이상의 항목이 일부 필드에 대해 같은 값을 가질 가능성이 증가할 것이다.이런 충돌이 존재할 때, 체인식 비교기는 우리에게 정확한 순서를 허용할 것이다.
이 글은 최초로 나의 사이트에 발표되었다.너는 Java Streams and Collection Manipulation에서 더 많은 정보와 예를 찾을 수 있다.

좋은 웹페이지 즐겨찾기