use*_*190 4 java lambda java-8 java-stream
我正在玩Java 8中的流和lambdas,因为我之前从未使用它们并试图转换20到19的所有人的年龄并打印出他们的名字,但是我得到以下错误
Cannot invoke map(Person::getName) on the primitive type void
Run Code Online (Sandbox Code Playgroud)
这是我的代码
System.out.println(
people.stream()
.filter(person -> person.getAge() == 20)
.forEach(person -> person.setAge(19))
.map(Person::getName));
Run Code Online (Sandbox Code Playgroud)
如果有人能告诉我为什么会这样,或者让我知道如何改进或修改此代码,我们将不胜感激.
forEach 是一个终端操作,不会返回它工作的流.
通常,您应该避免使用forEach修改流,即使是最终操作.相反,您应该使用map修改流的项目.
以下是如何执行此操作的示例,其中包括合法使用forEach:
people.stream()
.filter(person -> person.getAge() == 20)
.map(person -> new Person(person.getName(), person.getAge() -1 /*, ...*/))
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
关于该代码的一些注意事项:
map(...)只转换流,而不是数据源(the people Collection).如果以后要使用转换后的结果,你会想.collect()在Stream进入一个新的Collection与适当的Collector(例如Collectors.toList())
如果您遵循这条道路,那么您的新终端操作就是collect(),并且您不能再使用.forEach()了.一种解决方案是使用.forEach()新方法Collection(不需要a stream,从1.8开始forEach()实现Iterable),另一种方法是.peek()在流上使用你map()作为非终端等效的.forEach()
关于使用peek(),请注意非终端操作是由终端操作驱动的:如果这个只返回流的一个元素(如.findFirst()),则只对该元素执行非终端操作,你不应该'除此之外.
| 归档时间: |
|
| 查看次数: |
3213 次 |
| 最近记录: |