非常感谢所有的答案/评论!
为我在原始问题中输入的错误代码示例道歉。我试图简化我的问题,但徒然地使它变得相当混乱。
我稍微更改了代码:
<Provider store={store}>
<Router>
<React.Suspense fallback={loading()}>
<Route exact path="/login" name="Login Page" render={props => <Login {...props}/>} />
<Route exact path="/register" name="Register Page" render={props => <Register {...props}/>} />
<Route exact path="/404" name="Page 404" render={props => <Page404 {...props}/>} />
<Route exact path="/500" name="Page 500" render={props => <Page500 {...props}/>} />
<PrivateRoute exact path="/" component={DefaultLayout} />
</React.Suspense>
</Router>
</Provider>
我遇到了第一个错误:
无法推断AbstractMap.SimpleEntry <>
的类型参数
所以我将最后一行更改为:
Map<String, Boolean> map1 = new HashMap<>();
map1.put("Yes", Boolean.FALSE);
map1.put("No", Boolean.FALSE);
Map<String, Map<String, List<String>>> map2 = new HashMap<>();
List<String> list1 = Arrays.asList("Apple", "Peach");
List<String> list2 = Arrays.asList("Pear", "Orange");
Map<String, List<String>> innerMap = new HashMap<>();
innerMap.put("fruit1", list1);
innerMap.put("fruit2", list2);
map2.put("Fruits", innerMap);
map2.put("Vege", new HashMap<>());
Optional<? extends Entry<String, ? extends Object>> optional = Stream
.of(map1.entrySet().stream().filter(e -> e.getValue()).findFirst(),
map2.entrySet().stream().filter(entry -> entry.getValue().entrySet()
.stream()
.anyMatch(e -> e.getKey().equals("Fruit") && e.getValue().stream().anyMatch(
i -> i.equals("Pear"))))
.findFirst())
.filter(Optional::isPresent).map(Optional::get).findFirst();
optional.orElse(new AbstractMap.SimpleEntry<>("NULL", null));
然后在orElse上弹出一个新错误:
类型为Optional>的方法orElse(capture#4-of扩展Map.Entry)不适用于参数(AbstractMap.SimpleEntry)
据我了解,两个Map的键类型相同,但值类型不同。每个地图的过滤器也不同。因此,返回的值将是Optional,其String类型为Key,而Generic类型为Value。
我最初的问题是我不知道如何为此Optional提供默认值,因为Entry的Value类型是通用的(我现在仍然不知道答案)。
受@Ole的启发,我重构了这样的代码:
optional.orElse(new AbstractMap.SimpleEntry<String, Object>("NULL", null));
虽然我只将过滤后的Entry的Key收集到流中,但是JAVA编译器似乎运行良好。我得到的驱逐结果为
结果:水果
但是看来我还在使事情变得过于复杂...
答案 0 :(得分:0)
Map.Entry<String, ?> result = Stream.of(map1, map2)
.flatMap(m -> m.entrySet().stream())
.filter(e -> e.getKey().equals("Yes"))
.findFirst()
.orElse(new AbstractMap.SimpleEntry<>("NULL", null));
System.out.println(result);
输出:
NULL =空
您使Optional
中findFirst
的处理变得过于复杂。不要使用isPresent
或get
,orElse
会为您做所有的事情。
您也不需要AbstractMap.SimpleEntry
的类型参数。 Java从参数<String, Object>
推断出("NULL", null)
。
我发现从地图流开始更容易,因此我们只需要指定一次我们对地图的处理即可。
顺便说一句,您的每张地图仅包含一个条目。您的第二个put
操作具有相同的密钥,因此将覆盖第一个put
调用中的条目。这样,当您忽略第一个电话时,您可以获得相同的结果。