2017-09-19 2 views
1

Java8에서 스트림을 테스트 중이며 매우 실망한 문제가 있습니다.Java8 스트림 맵() 함수의 추가 괄호

 List<String> words = Arrays.asList("Oracle", "Java", "Magazine"); 
    List<String> wordLengths = words.stream().map((x) -> { 
     x.toUpperCase(); 
    }).collect(Collectors.toList()); 

경고 :

The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments ((<no type> x) -> {}) 

이 작업을 수행 어떤 경고를 던져

 List<String> words = Arrays.asList("Oracle", "Java", "Magazine"); 
    List<String> wordLengths = words.stream().map((x) -> x.toUpperCase()) 
     .collect(Collectors.toList()); 

그리고 두 번째 (거의 같은) : 나는 잘 컴파일 코드를 가지고 추가 괄호가 변경 되었습니까?

+1

를 사용하는 것이 좋습니다, 당신은 람다 본문에'return' 키워드를 제공해야합니다 (또한 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-LambdaBody) –

+1

'경고'가 아니라 컴파일 문제, * 완전히 다른 것들 – Eugene

답변

3

람다식이 값을 반환합니다. 당신은 괄호를 사용하는 경우 당신은 당신의 람다 함수에 return 문을 추가해야합니다

List<String> words = Arrays.asList("Oracle", "Java", "Magazine"); 
List<String> wordLengths = words.stream().map((x) -> { 
    return x.toUpperCase(); 
}).collect(Collectors.toList()); 
2

공식 Oracle tutorial

람다 표현에 따르면 다음과 같이 구성

쉼표로 구분 괄호 안의 형식 매개 변수 목록. CheckPerson.test 메서드에는 하나의 매개 변수 p가 포함되어 있습니다. 은 Person class의 인스턴스를 나타냅니다.

참고 : 람다 식에서 매개 변수의 데이터 형식을 생략 할 수 있습니다. 또한 하나의 매개 변수가 인 경우 괄호를 생략 할 수 있습니다. 예를 들어, 다음 람다 식에도 유효 이다

p -> p.getGender() == Person.Sex.MALE 
    && p.getAge() >= 18 
    && p.getAge() <= 25 

화살표 토큰 ->

한 식이나 문 블록 구성 본체. 이 예는 다음 식을 사용하여 단일 식을 지정하면

p.getGender() == Person.Sex.MALE 
    && p.getAge() >= 18 
    && p.getAge() <= 25 

후 자바 런타임 표현식을 평가 한 후 그 값을 반환합니다. 또는, 에게 return 문을 사용할 수 있습니다

p -> { 
    return p.getGender() == Person.Sex.MALE 
     && p.getAge() >= 18 
     && p.getAge() <= 25; 
} 

반환 문이 표현되지 않습니다; 람다 식에서는 을 중괄호 ({})로 묶어야합니다. 그러나 에 void 메소드 호출을 중괄호로 묶지 않아도됩니다.

email -> System.out.println(email) 

우리는 괄호를 생략 제공된 람다 식 (x) -> x.toUpperCase() 단지 하나의 파라미터가 있으므로 : x -> x.toUpperCase() 예를 들어, 다음은 유효 람다 식이다. String#toUpperCase은 새 String을 반환하므로 return 문과 중괄호를 사용할 필요가 없습니다. 대신 return 문을 사용하여 복잡한 블록을 만들었다면이를 중괄호로 묶어야합니다.또한이 경우에 당신이 브래킷과 람다의 반환 형식이 무효하지 않습니다를 사용하는 경우 Method ReferenceString::toUpperCase

List<String> wordLengths = words.stream().map(String::toUpperCase).collect(Collectors.toList());