【发布时间】:2017-06-24 12:03:58
【问题描述】:
我正在尝试加入姓名列表:
List<String> names;
names = books.stream()
.map( b -> b.getName() )
.filter( n -> ( (n != null) && (!n.isEmpty()) ) )
.collect(Collectors.joining(", "));
这不编译说:
不兼容的类型。推理变量 R 的边界不兼容
所以经过一番研究,似乎我误解了一些东西。我认为.map( b -> b.getName() ) 将类型返回/更改为字符串,那里似乎有问题。如果我改用.map(Book::getName),我仍然会收到错误,但我可能是don't fully understand the difference。
但是,这并没有抱怨:
List<String> names;
names = books.stream()
.map( b -> b.getName() )
.map( Book::getName )
.filter( n -> ( (n != null) && (!n.isEmpty()) ) )
.collect(Collectors.joining(", "));
谁能解释一下为什么?关于.map( b -> b.getName() ) 和.map(Book::getName) 之间差异的一些教学解释也很受欢迎,因为我认为我没有做对。
【问题讨论】:
-
你真的认为这么多的括号(
.filter( n -> ( (n != null) && (!n.isEmpty()) ) )比直接的.filter(n -> n!=null && !n.isEmpty())提高了可读性吗? -
嗯...我通常在任何时候使用括号,只要我有像 && 这样的运算符,只是为了清楚起见。在这种情况下你是对的,它看起来很麻烦
-
我知道
&&和||之间的运算符优先级不能直观地回答,因此即使在不必要的情况下,为了清楚起见放置大括号也是有道理的。但是对于唯一的&&运算符,没有办法曲解表达式。此外,还有另一个与逻辑表达式无关的外括号对。由于您也没有写b -> (b.getName()),因此在另一个表达式中有一个外部对是不一致的。 -
等待...
.map(b -> b.getName()).map(Book::getName)有效,但只有.map(b -> b.getName())无效?所以books其实不是Book的集合?所以b.getName()返回一个Book?可能这也是它不抱怨的原因。 -
@user1156544,你应该写这个有问题......这令人困惑
标签: java-8