Oli*_*POP 3 java lambda java-8
跟进这个问题.有这样的层次结构.A是基类:
A
/ \
B C
| A | | B | | C |
| getId()| |A.getId() | |A.getId()|
|isVisible()|
Run Code Online (Sandbox Code Playgroud)
以及以下内容:
List<A> mappings;
Run Code Online (Sandbox Code Playgroud)
我想将B实例的所有ID映射到B.isVisible()的值,并将C实例的ID映射到TRUE
在初始问题的帮助下,我将其改进为以下格式:
mappings.stream().filter(a -> a instanceof B)
.map(b -> (B)b)
.collect(Collectors.toMap(A::getId, m -> m.isVisible()));
Run Code Online (Sandbox Code Playgroud)
丑陋的版本是:
mappings.stream()
.collect(Collectors.toMap(A::getId, m ->
{
boolean isB = m instanceof B;
return isB ? ((B) m).isVisible() : true;
}));
Run Code Online (Sandbox Code Playgroud)
有关改进它的任何帮助,以提供更优雅的版本的默认值?
你的变种
mappings.stream()
.collect(Collectors.toMap(A::getId, m ->
{
boolean isB = m instanceof B;
return isB ? ((B) m).isVisible() : true;
}));
Run Code Online (Sandbox Code Playgroud)
并不是那么难看,因为它表达了你的意图.
但是你可以简化它,因为你不需要一个局部变量来保存m instanceof B:
mappings.stream()
.collect(Collectors.toMap(A::getId, m->m instanceof B? ((B)m).isVisible(): true));
Run Code Online (Sandbox Code Playgroud)
然后,根据经验,只要你boolean在复合布尔表达式中有一个文字,就有一个没有它的替代品.
mappings.stream()
.collect(Collectors.toMap(A::getId, m -> !(m instanceof B) || ((B)m).isVisible()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |