将具有lambda的类映射到默认值

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)

有关改进它的任何帮助,以提供更优雅的版本的默认值?

Hol*_*ger 7

你的变种

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)

  • @Eugene:nope,不必要的复杂布尔表达式是一个反复出现的事情,不仅在Stackoverflow上,所以我认为,这样一个表,提醒开发人员更简单的替代方案并证明我的ad hoc规则有效,即它应该总是响铃如果你在任何其他情境中看到"真"或"假"而不是唯一的常数,那么可能会有一些价值. (3认同)
  • @Eugene:也许值得张贴所有组合的完整表格进行演示...... (2认同)