화살표 연산자 '->'는 Java에서 무엇을합니까?


170

일부 코드를 통해 사냥하는 동안 화살표 연산자를 발견했습니다. 정확히 무엇을합니까? Java에는 화살표 연산자가 없다고 생각했습니다.

return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> {
        return Car.SEDAN == ((Car)arg0).getStyle();
});

세부 정보 : Java 6, Apache Commons Collection, IntelliJ 12

업데이트 / 답변 : IntelliJ 12는 람다를 지원하고 술어를 "폴딩"하고 람다로 표시하는 Java 8을 지원합니다. 아래는 "접히지 않은"코드입니다.

return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() {
    public boolean evaluate(Object arg0) {
        return Car.SEDAN == ((Car)arg0).getStyle();
    }
});

5
정확한 시나리오는 기존 코드를 읽기 쉬운 람다 식으로 렌더링 하는 IntelliJ 입니다. 실제 코드는 람다식이 아닙니다.
Thorbjørn Ravn Andersen

답변:


125

Java 8에 도입 된 새로운 람다 식의 구문 중 일부입니다.이 기능을 익히기위한 몇 가지 온라인 자습서가 있습니다. 여기에 대한 링크 가 있습니다. 기본적으로 ->매개 변수 (왼쪽)와 구현 (오른쪽)을 구분합니다.

람다 식을 사용하는 일반적인 구문은 다음과 같습니다.

(매개 변수)-> {Body} 여기서 '->'는 매개 변수와 람다 식 본문을 구분합니다.

매개 변수는 메서드와 같은 방식으로 괄호로 묶고 람다 식 본문은 중괄호로 묶인 코드 블록입니다.


10
JDK 6를 사용하여 영업 이익은, 정말 인 IntelliJ는 아래 @antonm 응답에 따라 코드를 접는이되도록
숀 풋내기 선원

6
@SeanLandsman OP는 Java 6을 사용하고있을 수도 있지만 문제에서 그는 다른 곳에서 해당 코드를 발견했다고 말합니다. IntelliJ에 신비의 오류를보고하지 않는 이유에 관해서는 (아마도이 있다 OP의 시스템의 어딘가에 설치 자바 7 버전). 그러나 이것은 Java에서 람다 식의 구문이므로 그것에 대해 의문의 여지가 없습니다.
Óscar López

37

기능 인터페이스를 구현하려는 경우에도 유용합니다.

Runnable r = ()-> System.out.print("Run method");

에 해당

Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.print("Run method");
            }
        };

이 기능은 왜 제공됩니까?
Akaisteph7

1
한 명의 호출자 만 해당 메소드를 호출 할 것이므로 메소드를 정의하지 않으려는 경우 @ Akaisteph7 이 경우 별도의 장소에 메소드를 정의하지 말고 메소드 본문을 전달하고 익명 메소드에 대해 읽고 람다를 읽으십시오.
Vivek Shukla

30

이 화살표는 IDE 때문에 존재한다고 생각합니다. IntelliJ IDEA는 일부 코드로 이러한 작업을 수행합니다. 이것을 코드 접기라고합니다. 화살표를 클릭하여 확장 할 수 있습니다.


36
@DavidConrad 아니오, 잘못이 아닙니다. IntelliJ는 실제로 기능 인터페이스의 인라인 구현을 접어서 람다처럼 보입니다.
balpha

12
Java 6의 "세부 사항 : Java 6, Apache Commons Collection, IntelliJ 12"질문을보십시오.
Anton-M

13

람다 식입니다.

이는 listOfCars에서 arg0이 해당 목록의 항목 중 하나임을 의미합니다. 그 항목으로 그는 괄호 안에 무엇이든지-> 할 것입니다.

이 예에서는 조건에 맞는 자동차 목록을 반환합니다.

Car.SEDAN == ((Car)arg0).getStyle();

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.