【发布时间】:2019-07-17 15:38:00
【问题描述】:
非常感谢所有答案/cmets!
为我在原始问题中输入的错误代码示例道歉。我试图简化我的问题,但显然它最终变得相当混乱。
我稍微改了一下代码:
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));
我得到了第一个错误:
无法推断 AbstractMap.SimpleEntry 的类型参数
所以我把最后一行改成:
optional.orElse(new AbstractMap.SimpleEntry<String, Object>("NULL", null));
然后orElse上弹出一个新的错误:
Optional类型中的orElse(capture#4-of ? extends Map.Entry)方法不适用于参数(AbstractMap.SimpleEntry)
据我了解,两个 Map 具有相同的 Key 类型但不同的 Value 类型。每个地图的过滤器也不同。因此,返回的将是一个 Optional,其 Entry 类型为 Key,但具有泛型类型 Value。
我最初的问题是我不知道如何为此 Optional 提供默认值,因为 Entry 的 Value 类型是通用的(我现在仍然不知道答案)。
受@Ole 的启发,我重构了如下代码:
String result = Stream
.of(map1.entrySet().stream().filter(e -> e.getValue()).map(Map.Entry::getKey).findFirst(), map2
.entrySet().stream().filter(entry -> entry.getValue().entrySet()
.stream()
.anyMatch(e -> e.getKey().contains("fruit") && e.getValue().stream().anyMatch(
i -> i.equals("Pear"))))
.map(Map.Entry::getKey)
.findFirst())
.filter(Optional::isPresent).map(Optional::get).findFirst().orElse("NULL");
System.out.println("result: " + result);
虽然我只将过滤后的条目的密钥收集到流中,但 JAVA 编译器似乎运行良好。我得到的执行结果为
结果:水果
但似乎我在这里仍然过于复杂......
【问题讨论】:
-
null无法推断为? extends Object&Serializable&Comparable<?>。也许明确的演员会有所帮助
标签: java generics java-stream optional pecs