Java8에서 lambda 표현식의 응용 및 범용 관련 지식
범용 프로그래밍에 사용되는 모든 것은 코드를 간소화하기 위해서이다
장면:
직원 정보를 기록하는 데이터 클래스
public class Employee {
public String name;
public int age;
public char sex;
public String time;
public int salary;
}
우리는 이런 데이터를 가지고 있다
List<Employee> data = Arrays.asList(e1,e2,e3......)
현재 요구 사항: 직원 Employee를 이름의 이니셜(영어 이름으로 가정)에 따라 그룹화합니다.그렇다면 우리가 얻어야 할 결과는 하나일 것이다
Map:char -> List<Employee>
이런 매핑 관계
public static Map<Character, List<Employee>> groupByFirstChar(
List<Employee> data){
Map<Character, List<Employee>> result = new HashMap<>();
for(Employee e : data){
Character c = e.name.charAt(0);
List<Employee> l = result.get(c);
if(l == null){
l = new ArrayList<>();
result.put(c, l);
}
l.add(e);
}
return result;
}
코드가 복잡하지 않아요. 금방 완성할 수 있어요. 사장님이 효율이 이렇게 높다는 걸 보고 임금에 따라 조를 나누세요. 5000 이하, 5000~10000의...기다리다어렵지 않을 거예요. 키를 바꿔서 논리적으로 처리하면 돼요.
public static Map<String, List<Employee>> groupBySalary(List<Employee> data) {
Map<String, List<Employee>> result = new HashMap<>();
for (Employee e : data) {
String key = separate(e.salary);
List<Employee> l = result.get(key);
if (l == null) {
l = new ArrayList<>();
result.put(key, l);
}
l.add(e);
}
return result;<br>}
private static String separate(int salary) {
if (salary <= 5000) {
return "5000 ";
}
if (salary <= 10000) {
return "5000~10000";
}
if (salary <= 20000) {
return "10000~20000";
}
return "20000 "
}
그리고 사장님은 또 말씀하셨어요. 직원의 입사 연도에 따라 팀을 나누자고...여기에 코드는 쓰지 않습니다. 조금만 비교해 보면 그룹을 나누어도 유일한 변화는 키 값의 선택 방식입니다.
처음으로 Employee의 name의 첫 글자를 key로 사용합니다.
Employee e -> e.name.charAt(0)
두 번째는 Employee의 salary를 방법에 따라 separat에서 String으로 key로 변환합니다.
Employee e -> separate(e.salary):String
이와 같이 유추하다
Employee e -> getYear(e.time):String
사실 처음으로 알파벳을 얻는 방법을 단독으로 쓸 수도 있다
Employee e -> getFirstChar(e.name):Character
더 아름다워 보이기 위해 세 가지 방법의 매개 변수를 모두 Employee 방법체로 설정하면 여기에 매개 변수와 되돌아오는 값만 표시합니다.
Employee e -> getFirstChar(e) : Character
Employee e -> separate(e) : String
Employee e -> getYear(e) : String
->의 왼쪽은 매개 변수,:의 오른쪽은 반환값, ->의 오른쪽은 방법의 서명그러면 우리는 변화된 부분을 매개 변수로 추출하고 다른 변하지 않는 부분을 방법체로 추출하면 중복된 코드를 줄일 수 있다. 분명히 변화된 부분은 위에서 열거한 것이고Employeeee를 키로 바꾸는 방법이지만 우리는 자바가 방법을 매개 변수로 전달할 수 없다는 것을 안다.그러나 경험이 조금 있는 프로그래머에게 이것은 문제가 아니다. 우리는 인터페이스를 사용하여 우리의 목적을 실현할 수 있고 또 다른 문제에 부딪힐 수 있다. 상기 세 가지 방법의 반환값은 다르기 때문에 우리는 범형을 사용해야 한다.
public static <K> Map<K, List<Employee>> groupByKey(List<Employee> data, GetKey<K> getKey){
Map<K, List<Employee>> result = new HashMap<>();
for(Employee e : data) {
K key = getKey.getKey(e);
List<Employee> l = result.get(key);
if (l == null) {
l = new ArrayList<>();
result.put(key, l);
}
l.add(e);
}
return result;
}
interface GetKey<K>{
K getKey(Employee e);
}
그러면 위의 첫 번째 수요는 이렇게 이루어질 수 있어요.
Map<Character, List<Employee>> result = groupByKey(data, new GetKey<Character>() {
@Override
public Character getKey(Employee e) {
e.name.charAt(0);
}
});
두 번째 요구 사항
Map<String, List<Employee>> result = groupByKey(list, new GetKey<String>() {
@Override
public String getKey(Employee e) {
separate(e.salary);
}
});
우리가 범용 매개 변수와 익명 내부 클래스의 실현만 바꾸면 된다는 것을 알 수 있다. 유일한 문제는 이렇게 쓰는 것이 정말 보기 좋지 않을 뿐만 아니라 많은 관례적인 공공 코드, 특히 익명 내부 클래스에 나타난다.사실 우리는 이 익명 내부 클래스의 매개 변수와 반환 값에만 관심을 가지고, 다른 부분은 단지 문법 요구일 뿐이다.
java8은 우리에게 복잡한 관례적인 공무를 피하기 위한 좋은 방법을 제공했다. lambda 표현식, 이상의 실현은
Map<Character, List<Employee>> resultByFirstChar = groupByKey(list, e -> e.name.charAt(0));
Map<String, List<Employee>> resultBySalary = groupByKey(list, e -> separate(e.salary));
lambda 표현식은 우리가 관심을 가지는 매개 변수와 되돌아오는 값만 나타낼 뿐만 아니라 유형 추정으로 인해 매개 변수 유형을 줄일 수 있다. 구체적인 문법은 여기에 소개되지 않고 인터넷에서 많은 자료를 찾을 수 있다.extra:
만약 당신이 범형에 대해 잘 알고 있다면, 방법groupByKey는 더욱 추상적일 수 있다.
public static <K, E> Map<K, List<E>> groupBy(List<? extends E> data, Function<? super E, ? extends K> fun) {
Map<K, List<E>> result = new HashMap<>();
for(E e : data) {
K k = fun.apply(e);<br> List<E> l = result.get(k);
if(l == null) {
l = new ArrayList<>();
result.put(k, l);
}
l.add(e);
}
return result;<br>
}
우리는 Employee라는 종류도 뽑았는데, 좋은 점은 명백히 알 수 있다Function 인터페이스는 java8에 새로 추가된 인터페이스입니다.
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
T 유형을 입력하여 R 유형으로 돌아갑니다.범형과 함수식 프로그래밍이 잘 결합되었습니다.java8의 새로운 특성은 여러 가지 구설에 올랐지만 좋은 점을 가져다 줄 수 있다는 것은 우리에게 더 많은 선택을 주었습니다.시간이 있으면stream,java8의 또 다른 이점을 소개할게요.
위에서 말한 것은 편집자가 여러분께 소개한 자바8에서 lambda표현식의 응용 및 범용 관련 지식입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 점이 있으면 저에게 메시지를 남겨 주시면 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Liquibase】DB 작성·테이블 정의 변경신규 스타터 프로젝트 작성 Liquibase와 MySQL 선택 application.properties에 DB 정보 넣기 MySQL에서 "testdatabase"라는 데이터베이스 만들기 빌드 종속성 추가 build....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.