관리 메뉴

IT & Life

[해외] 자바(Java) 8 Lambda에 대한 간략한 소개 본문

IT 관련 정보

[해외] 자바(Java) 8 Lambda에 대한 간략한 소개

미운앙마 2017. 11. 25. 02:09
http://www.makeuseof.com/tag/introduction-java-8-lambdas/

 

 

Java 8 Lambda에 대한 간략한 소개


자바 프로그래머이고 자바 8 람다에 대해 더 알고 싶다면이 기사에서 람다 구문과 사용법을 자세히 살펴볼 것이다.

 

Java 의 람다 식은 표현식 에서 클래스의 메서드를 표현하는 간결한 방법입니다. 매개 변수 목록과 본문이 있습니다. 본문은 단일 표현식이나 블록이 될 수 있습니다 . 이것은 일반적으로 인터페이스의 구현이 필요한 곳에서 사용됩니다. 이러한 필요성은 대개 인터페이스를 메소드 호출을위한 인수로 요구할 때 발생합니다.

 


일부 간단한 람다 식

 

람다 식의 간단한 예제를 살펴 보겠습니다.

 

다음은 두 개의 숫자 x 와 y 를 받아들이고 합을 계산 하는 람다 식입니다 .

 

(int x,int y) -> x + y;


보다 간결한 표현을 위해 매개 변수 유형을 삭제하십시오.

 

(x, y) -> x + y;


매개 변수를 허용하지 않는 함수를 정의하십시오.

 

() -> 404;


다음도 유효하며 매개 변수를 허용하지 않고 아무 것도 반환하지 않습니다.

 

() -> {}


단일 매개 변수에 대한 매개 변수를 묶는 괄호가 필요하지 않습니다.

 

x -> x + 1


더 복잡한 코드 블록도 가능합니다. 다음 람다는 한 줄의 매개 변수를 받아들이고 그것에 대한 처리를합니다. 매개 변수의 유형은 주변 컨텍스트에서 유추됩니다.

 

 

line -> {
String[] x = pattern.split(line);
return new Player(Integer.parseInt(x[0]),
                  x[1],
                  x[2],
                  x[3],
                  Integer.parseInt(x[4]));
}

 


깨끗하고 간결한 코딩

 

람다 식을 사용하면 코드를 깨끗하고 간결하게 만들 수 있습니다. 이를 지원하기 위해 Java 8 클래스는 람다를 광범위하게 사용합니다.

 

 

리스트 또는 세트에 대한 루핑

 

List , Set , Queue 와 같은 콜렉션 클래스 는 Iterable 인터페이스를 구현 하므로 요소를 훨씬 쉽게 루핑 할 수 있습니다.

 

이름 목록을 선언하십시오.

 

 

List<String> names = Arrays.asList("Joe", "Jack", "James", "Albert");
람다없이 목록을 반복 :

for (String name : names) {
    System.out.println(name);
}

 


람다를 사용하면 위의 루프를 다음과 같이 작성할 수 있습니다.

 

names.forEach(name -> System.out.println(name));


Java 8 메소드 참조를 사용하면 위의 내용을 다음과 같이보다 간결하게 작성할 수 있습니다.

 

names.forEach(System.out::println);

 


지도 루핑하기

 

지도 의 키와 값의 매핑입니다. 맵을 루핑 할 때 (키, 값) 맵핑을 반복합니다. 이 상황에 람다를 어떻게 사용하는지 비교하십시오.

먼저지도를 정의하십시오.

 

 

Map<String,Integer> map = new HashMap<>();
map.put("Atlanta, Georgia", 110);
map.put("Austin, Texas", 115);
map.put("Baltimore, Maryland", 105);
map.put("Birmingham, Alabama", 99);
map.put("Boston, Massachusetts", 98);

 


이 맵을 기존 방식으로 반복 할 수 있습니다.

 

 

for (Map.Entry<String,Integer> e : map.entrySet()) {
    System.out.println(e.getKey() + " => " + e.getValue());
}


다음은 람다를 사용하여 똑같은 일을 빠르고 간결하게 수행하는 방법입니다.

 

map.forEach((k, v) -> System.out.println(k + " => " + v));

 


기능 인터페이스

 

람다 식의 반환 형식은 무엇입니까? 즉, 다음 문장에서 X 의 유형은 무엇 입니까?

 

X x = a -> a + 1;


람다 표현식의 반환 유형은 단일 추상 메소드가있는 인터페이스 인 기능적 인터페이스 입니다. 호환 가능한 추상 메서드를 사용하여 인터페이스에 람다 식을 할당 할 수 있습니다. 아래에 몇 가지 예가 나와 있습니다.

 

 

다중 스레드 작업 만들기

 

별도의 스레드에서 실행을 위한 작업을 생성하는 것을 고려하십시오. 작업을 Runnable 인터페이스 로 정의 하고 run () 메소드를 구현해야 합니다 . 여기서 Runnable 은 기능적인 인터페이스입니다.

 


class MyTask implements Runnable {
   ...
   public void run() {
     // implement your task here
     System.out.println("Running in a separate thread now.");
   }
   ...
}

 


그런 다음 MyTask 클래스 의 인스턴스를 생성하고 이를 사용하여 새로운 실행 스레드를 시작할 수 있습니다.

 

MyTask task = new MyTask();
Thread thread = new Thread(task);
thread.start();


람다를 사용하면 Runnable 을 만드는 과정 이 훨씬 쉬워집니다. 위의 작업 정의는 다음과 같이 다시 작성할 수 있습니다.

 

Runnable task = () -> System.out.println("Running in a separate thread now.");


또는:

 

Thread thread = new Thread(() -> System.out.println("Running in a separate thread now."));
thread.start();

 


Comparator를 사용하여 비교

 

비교기는 특정 유형의 개체를 비교하기위한 기능 인터페이스입니다. compare () 라는 하나의 추상적 인 메서드를 정의하며 , 람다 식을 사용하여 정의 할 수 있습니다.

 

다음은 대문자와 소문자를 구별하지 않고 비교 하는 데 사용되는 Comparator를 만드는 람다식 입니다.

 

Comparator<String> cmp = (x, y) -> x.compareToIgnoreCase(y);


Comparator 기능 인터페이스 의 인스턴스 가 생성되면 필요에 따라 다시 사용할 수 있습니다.

 

여기서는 문자열 목록을 오름차순으로 정렬합니다.

 

 

List<String> names = Arrays.asList("Joe", "Jack", "James", "Albert");
Collections.sort(names, cmp);
names.forEach(System.out::println);
// prints
Albert
Jack
James
Joe

 


위의 목록은 제 위치에서 정렬됩니다. 다음과 같이 binarySearch () 메소드를 사용하여 검색 할 수 있습니다 .

 

System.out.println("search(Joe):" + Collections.binarySearch(names, "Joe", cmp));
# prints
search(Joe):3


목록에서 최대 값과 최소값을 계산하는 것은 lambdas를 사용하는 것 또한 쉽습니다.

데이터 정의 :

 

List<Integer> temps = Arrays.asList(110, 115, 105, 99, 98, 54, 109, 84, 81, 66, 72, 135, 115, 75, 82, 90, 88);


비교기를 정의하려면 람다 식을 사용하십시오.

 

Comparator<Integer> cmpTemp = (x, y) -> Integer.compare(x, y);


최대 및 최소 인쇄 :

 

System.out.println("------ Max/Min ------");
System.out.println(Collections.max(temps, cmpTemp) + "/" + Collections.min(temps, cmpTemp));

 


GUI 프로그래밍에서 사용

 

람다 식은 이벤트 처리기를 구현하는 GUI 프로그래밍에서도 매우 유용합니다. 다음은 버튼 클릭 핸들러 사용의 예입니다.

 

JButton button = new JButton("Click Me");
button.addActionListener(e -> System.out.println("Button clicked!"));


그리고 Java 8에서 lambdas를 사용하는 방법을 간략하게 살펴 보았습니다.

Comments