【发布时间】:2018-01-03 05:52:31
【问题描述】:
跟进来自this 的问题。 有这样的层次结构。其中 A 是基类:
A
/ \
B C
| A | | B | | C |
| getId()| |A.getId() | |A.getId()|
|isVisible()|
以及以下内容:
List<A> mappings;
我想将 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()));
丑陋的版本是:
mappings.stream()
.collect(Collectors.toMap(A::getId, m ->
{
boolean isB = m instanceof B;
return isB ? ((B) m).isVisible() : true;
}));
对改进它以提供更优雅版本的默认 true 有任何帮助吗?
【问题讨论】:
-
A类包含
getId方法,还是我错了? -
@OlimpiuPOP 那你为什么打电话给
B::getId? -
你的例子有点混乱。在上一个 lambda 中,您将变量命名为
m,但您使用的是mapping instanceof B。请检查您的示例以避免与您的问题无关的问题。.filter(a -> instanceof B)也应该是.filter(a -> a instanceof B) -
您应该能够将
m -> { boolean isB = m instanceof B; return isB ? ((B) m).isVisible() : true; }减少到m -> m instanceof B ? ((B) m).isVisible() : true(尽管目前还不清楚这是否是您想要的)。 -
说真的 - 你所拥有的并不丑陋。你不会得到更好的建议。 Pshemo 是对的 - 这是你应该做的唯一的事情,以使你的代码更好......