나는 구문 부분을 쓰지 않을 것입니다. Java8의 새로운 기능이 우리에게 가져올 수있는 편의 시설을 확인하기 위해 실용적인 질문을 제기합시다.
그건 그렇고, 일부 일반 프로그래밍이 사용되며, 모든 것이 코드를 단순화하는 것입니다.
장면:
직원 정보를 기록하는 데이터 클래스
공개 클래스 직원 {공개 문자열 이름; 공개 int 연령; 공개 숯 성; 공개 문자열 시간; 공개 연봉;}이 유형의 데이터 열이 있습니다
목록 <plineperee> data = arrays.aslist (e1, e2, e3 ......)
현재 필요가 있습니다 : 그룹 직원의 이름의 초기 편지에 의한 직원 (모두 영어 이름이라고 가정) :
그런 다음 우리가 얻고 싶은 결과는 Map:char -> List<Employee> 와 같은 매핑 관계가되어야합니다.
public static map <문자, 목록 <Employee >> GroupByFirstchar (list <Employee> data) {map <문자, list <Employee>> result = new Hashmap <> (); for (Employee e : data) {문자 c = e.name.charat (0); <Employee> l = result.get (c); if (l == null) {l = new ArrayList <> (); result.put (c, l); } l.add (e); } 반환 결과;}코드는 복잡하지 않으며 곧 완료 할 수 있습니다. 상사는 당신이 너무 효율적이라는 것을 알기 때문에, 그는 당신이 당신의 급여에 따라 그룹으로 나누어 5,000, 5,000 ~ 10,000 미만의 사람들에 대해 그룹으로 나눌 것이라고 말했습니다.
너무 어렵지 않을 것입니다. 키를 바꾸고 논리적으로 조금 처리하십시오.
public static map <string, list <Employee >> groupBysAlary (list <Employee> data) {map <string, list <Employee>> result = new Hashmap <> (); for (Employee e : data) {string key = 별도 (e.salary); List <plineplyee> l = result.get (키); if (l == null) {l = new ArrayList <> (); result.put (key, l); } l.add (e); } return result; <br>} private static string 별도 (int salary) {if (Salary <= 5000) {return ""5000 이하 "; } if (Salary <= 10000) {return "5000 ~ 100000"; } if (Salary <= 20000) {return "10000 ~ 20000"; } "20000 이상"} 반환}그런 다음 상사는 다시 고용 연도에 따라 직원들을 그룹으로 나누자. . .
나는 여기에 코드를 쓰지 않을 것입니다. 비교하면 어떻게 그룹화하든 유일한 변경 사항은 키 값을 선택하는 방법입니다.
직원 이름의 첫 번째 편지는 처음으로 열쇠로 사용됩니다.
직원 E-> e.name.charat (0)
두 번째는 직원의 급여를 method searat에 따라 열쇠로 문자열로 변환합니다.
직원 E-> 별도 (E.Salary) : 문자열
등
직원 E-> getyear (e.time) : 문자열
실제로, 처음으로 첫 번째 문자를 단일 방법으로 쓸 수도 있습니다.
직원 E-> GetFirstchar (E.Name) : 문자
더 아름답게 보이려면 세 가지 방법의 매개 변수가 직원에게 설정되어 있다고 말할 수 있습니다. 방법 본문은 쓰여져 있지 않습니다. 매개 변수와 반환 값 만 여기에 나열되어 있습니다.
Employee E-> GetFirstchar (e) : char
->의 왼쪽은 매개 변수이며 오른쪽은 다음과 같습니다. 반환 값이며 오른쪽은 메소드의 서명입니다.
그런 다음 자연스럽게 변경된 부분을 매개 변수 및 기타 변경되지 않은 부품으로 추출하여 메소드 본문으로 추출하여 중복 코드를 생략 할 수 있습니다. 분명히, 변경된 부분은 위에 나열된 방법으로 직원 E를 키로 변환하지만 Java는 메소드를 매개 변수로 전달할 수 없다는 것을 알고 있습니다. 그러나 이것은 약간의 경험이있는 프로그래머에게는 문제가되지 않습니다. 우리는 인터페이스를 사용하여 목표를 달성 할 수 있으며 동시에 또 다른 문제가 발생합니다. 위의 세 가지 방법의 반환 값은 다르므로 제네릭을 사용해야합니다.
public static <k> map <k, list <Employee >> groupBykey (목록 <Employee> 데이터, getkey <k> getkey) {map <k, list <Employee >> result = new Hashmap <> (); for (Employee e : data) {k key = getKey.getKey (e); List <plineplyee> l = result.get (키); if (l == null) {l = new ArrayList <> (); result.put (key, l); } l.add (e); } return result;} 인터페이스 getkey <k> {k getkey (Employee e);}위의 첫 번째 요구 사항은 이러한 방식으로 실현 될 수 있습니다.
Map <문자, 목록 <Employee >> result = GroupByKey (데이터, New GetKey <atiregne> () {@Override public charac두 번째 요구 사항
map <string, list <Employee >> result = GroupByKey (List, New GetKey <string> () {@Override public String getKey (Employee e) {별도 (e.salary);}});일반 매개 변수와 익명의 내부 클래스의 구현 만 변경하면됩니다. 유일한 문제는 그것이 현실적이지 않으며 많은 일상적인 코드가 익명의 내부 클래스에 특히 반영된다는 것입니다.
실제로, 우리는이 익명의 내부 클래스의 매개 변수와 반환 값에만 관심이 있으며 나머지는 구문 요구 사항 일뿐입니다.
Java8은 복잡한 루틴을 피할 수있는 좋은 방법을 제공합니다. Lambda Expressions, 위의 구현은 다음과 같이 작성할 수 있습니다.
map <문자, 목록 <Employee >> resultByFirstChar = GroupByKey (list, e-> e.name.charat (0)); map <string, list <Employee>> resultBysAlary = groupByKey (list, e-> 별도 (e.salary));
람다 표현식은 우리가 관심있는 것, 매개 변수 및 반환 값을 보여줍니다. 동시에 유형의 추론으로 인해 매개 변수 유형을 생략 할 수 있습니다. 특정 구문은 여기에 소개되지 않습니다. 인터넷에서 많은 정보를 찾을 수 있습니다.
추가의:
제네릭을 잘 이해하면 GroupByKey 방법을 더 추상화 할 수 있습니다.
public static <k, e> map <k, list <e >> groupby (list <? extrends 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); } 반환 결과; <br>}우리는 또한 직원 수업을 추출했으며 혜택은 분명합니다.
함수 인터페이스는 Java8에 새로 추가 된 인터페이스입니다.
@functionalInterFacePublic Interface 함수 <t, r> {r apply (t t);}r 유형으로 돌아갈 t 유형을 입력하십시오. 제네릭과 기능 프로그래밍의 조합은 매우 좋습니다. Java8의 새로운 특징은 다양한 종류의 불만으로 비판을 받았지만 항상 혜택을 가져 오는 것이 좋습니다.
시간이 있다면 스트림을 소개하겠습니다. Java8의 또 다른 훌륭한 도구
위의 것은 Java 8에서 Lambda 표현식의 적용과 편집자가 귀하에게 소개 한 일부 일반적인 관련 지식입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!