Java8流map()函数中的附加括号

时间:2017-09-19 20:13:31

标签: java-8 java-stream

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

这些额外的括号有什么变化?

2 个答案:

答案 0 :(得分:3)

您的lambda表达式返回一个值。如果使用括号,则需要在lambda函数中添加一个return语句:

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

答案 1 :(得分: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运行时将进行求值   表达式然后返回它的值。或者,您可以使用   退货声明:

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语句和大括号。如果我们有一个带有return语句的复杂块,我们必须将它括在括号中。此外,在这种情况下,最好使用Method Reference String::toUpperCase

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