我在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) -> {})
这些额外的括号有什么变化?
答案 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());