我正在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) -> {})这个额外的括号有什么变化?
发布于 2017-09-19 20:17:42
lambda表达式返回一个值。如果使用括号,则需要向lambda函数添加返回语句:
List<String> words = Arrays.asList("Oracle", "Java", "Magazine");
List<String> wordLengths = words.stream().map((x) -> {
return x.toUpperCase();
}).collect(Collectors.toList());发布于 2017-09-19 22:48:42
根据官方的Oracle教程
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 -> {返回p.getGender() == Person.Sex.MALE && p.getAge() >= 18 & p.getAge() <= 25;} 返回语句不是表达式;在lambda表达式中,必须用大括号({})括住语句。但是,不必将空方法调用包含在大括号中。例如,以下是一个有效的lambda表达式: 电子邮件-> System.out.println(电子邮件)
由于提供的lambda表达式(x) -> x.toUpperCase()中只有一个参数,所以可以省略括号:x -> x.toUpperCase()。String#toUpperCase返回一个新的String,因此不需要使用return语句和大括号。如果相反,我们有一个包含返回语句的复杂块,那么我们必须将它括在大括号中。此外,在这种情况下,最好使用方法参考 String::toUpperCase。
List<String> wordLengths = words.stream().map(String::toUpperCase).collect(Collectors.toList()); https://stackoverflow.com/questions/46309032
复制相似问题