2017-09-19 52 views
1

我在Java8中工作/測試流,並遇到非常令人沮喪的問題。 我有這很好編譯的代碼:它拋出一個警告Java8流映射()函數中的其他括號

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

而第二個(幾乎相同):

 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) -> {}) 

這說明什麼額外的括號已經改變了?

+1

如果您正在使用的支架和拉姆達的返回類型不是void,你有你的身體拉姆達供應'return'關鍵字(見也是https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-LambdaBody) –

+1

這不是'警告',而是一個編譯問題,*完全*不同的東西 – Eugene

回答

3

您的lambda表達式返回一個值。如果你使用括號,你需要一個return語句添加到您的lambda表達式:

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

根據官方Oracle tutorial

lambda表達式由以下部分組成:

用逗號分隔括號內的形式參數列表。 CheckPerson.test方法包含一個參數p,其中 代表Person class的一個實例。

注意:您可以省略lambda表達式中 表達式中參數的數據類型。另外,如果只有一個參數 ,則可以省略括號。例如,下面的lambda表達式也 有效:

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

箭頭標記,->

的主體,它由單個表達式或語句塊。 此示例使用下面的表達式:

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

如果指定一個表達式,那麼Java運行時計算 的表達式,然後返回其值。另外,您也可以使用 return語句:

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

return語句不是一個表達式;在lambda表達式中,您必須將括號中的語句({})包含在內。但是,您不必 用大括號括起void方法調用。例如,下面的 是有效lambda表達式:

email -> System.out.println(email) 

由於只有一個在所提供的lambda表達式(x) -> x.toUpperCase()參數,我們可以省略括號:x -> x.toUpperCase()String#toUpperCase返回新的String,因此不需要使用return語句和大括號。相反,如果我們有一個複雜的返回語句塊,我們必須將它放在大括號中。此外,在這種情況下,最好使用Method ReferenceString::toUpperCase

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