Lambdas를 사용하여 Java에서 간단한 컬렉션 작업 수행
초급반
우리는 간단한 반부터 학생들을 위해 이름, 나이, 점수를 저장할 것이다.이것은 뒤의 예시에서 우리에게 도움이 될 것이다.
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에서 더 많은 정보와 예를 찾을 수 있다.
Reference
이 문제에 관하여(Lambdas를 사용하여 Java에서 간단한 컬렉션 작업 수행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pazvanti/simple-collection-manipulation-in-java-using-lambdas-d96텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)