我想加入一个名单:
List<String> names;
names = books.stream()
.map( b -> b.getName() )
.filter( n -> ( (n != null) && (!n.isEmpty()) ) )
.collect(Collectors.joining(", "));
Run Code Online (Sandbox Code Playgroud)
这不会编译说:
不兼容的类型.推理变量R具有不兼容的边界
所以经过一些研究,似乎有些东西我误解了.我认为.map( b -> b.getName() )返回/将类型更改为String,似乎有些错误.如果我使用.map(Book::getName),我仍然会收到错误,但我可能并不完全理解其中的差异.
但是,这不抱怨:
List<String> names;
names = books.stream()
.map( b -> b.getName() )
.map( Book::getName )
.filter( n -> ( (n != null) && (!n.isEmpty()) ) )
.collect(Collectors.joining(", "));
Run Code Online (Sandbox Code Playgroud)
有人能解释一下为什么吗?关于它们之间的差异的一些教学解释.map( b -> b.getName() )也.map(Book::getName)被赞赏,因为我认为我没有做对.
joining(", ")collector将使用传递的字符串收集所有字符串并将其连接到单个字符串.collect在这种情况下String,returing类型是,但你试图将结果分配给List.
如果要列出要收集的字符串,请使用Collectors.toList().
如果你有Book实例的集合,那么你就足以将Books的流映射到s的流String一次.
lamdba有一个运营商块,一般来说:
b -> {
// here you can have other operations
return b.getName();
}
Run Code Online (Sandbox Code Playgroud)
如果lambda有单个运算符,则可以缩短:
b -> b.getName()
Run Code Online (Sandbox Code Playgroud)方法引用只是具有单个运算符的lambda的"快捷方式":
b -> b.getName()
Run Code Online (Sandbox Code Playgroud)
可以替换为
Book::getName
Run Code Online (Sandbox Code Playgroud)
但如果你有像这样的lambda:
b -> b.getName().toLowerCase()
Run Code Online (Sandbox Code Playgroud)
在这里你不能参考getName方法,因为你需要做额外的调用.
| 归档时间: |
|
| 查看次数: |
457 次 |
| 最近记录: |