通过流加入字符串

use*_*544 3 java-8

我想加入一个名单:

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)被赞赏,因为我认为我没有做对.

cyb*_*oft 7

joining(", ")collector将使用传递的字符串收集所有字符串并将其连接到单个字符串.collect在这种情况下String,returing类型是,但你试图将结果分配给List.

如果要列出要收集的字符串,请使用Collectors.toList().

如果你有Book实例的集合,那么你就足以将Books的流映射到s的流String一次.

lamdba和方法参考之间的区别

  • 方法引用可能稍微有点效率,但它确实有点*,所以不应该推动设计决策.另一点是`Book :: getName`引用了声明类,因此,有时在编译器在使用`b - > b.getName()`时无法推断出`b`的类型的情况下工作,尽管这样也可以通过使用`(Book b) - > b.getName()`来解决. (5认同)