Java 8 Map with optional key to map with value of optional as key
Java 8 Map with optional key to map with value of optional as key
我有一个 Map 并且需要获取包含可选值实际值的映射,如果它们存在 (Map)。
这个有效:
private Map<Price, String> getPricesForUserRelatedPrices(List<SpecialPrice> prices) {
Map<Optional<Price>, String> pricesWithOptional = prices.stream().collect(Collectors.toMap(this::getPrice, this::getName));
Map<Price, String> existingPrices = pricesWithOptional .entrySet().stream().filter(e -> e.getKey().isPresent()).collect(Collectors.toMap(e -> e.getKey().get(), Entry::getValue));
return existingPrices;
}
getPrice 可能 return 是可选的,因此需要过滤空条目。
带有可选键的地图当然只是一个临时地图,以使其具有一定的可读性。
以老式/非 lambda 方式,我会这样做:
private Map<Price, String> getPricesForUserRelatedPrices(List<SpecialPrice> prices) {
Map<Price, String> existingPrices = new HashMap<>();
for(SpecialPrice p: prices){
Optional<Price> price = getPrice(p);
if(price.isPresent())
existingPrices.put(price.get(), getName(price));
}
return existingPrices;
}
有没有更优雅的方式?
是的,只有当你在推导出 existingPrices
之后完全放弃 pricesWithOptional
时,才有替代方案,这是从你已经达到的地方退一步。
Map<Price, String> existingPrices = prices.stream()
.map(p -> Map.entry(getPrice(p), getName(p))) // to avoid multiple calls to these
.filter(e -> e.getKey().isPresent())
.collect(Collectors.toMap(entry -> entry.getKey().get(),
Map.Entry::getValue));
注意:如果getPrice
和getName
都是昂贵的,除非你确定getPrice
的存在,我宁愿建议留在 for
循环以提高可读性。
Map<Price, String> existingPrices = new HashMap<>();
for (SpecialPrice specialPrice : prices) {
Optional<Price> price = getPrice(specialPrice);
if (price.isPresent()) {
String name = getName(specialPrice);
existingPrices.put(price.get(), name);
}
}
我有一个 Map
这个有效:
private Map<Price, String> getPricesForUserRelatedPrices(List<SpecialPrice> prices) {
Map<Optional<Price>, String> pricesWithOptional = prices.stream().collect(Collectors.toMap(this::getPrice, this::getName));
Map<Price, String> existingPrices = pricesWithOptional .entrySet().stream().filter(e -> e.getKey().isPresent()).collect(Collectors.toMap(e -> e.getKey().get(), Entry::getValue));
return existingPrices;
}
getPrice 可能 return 是可选的,因此需要过滤空条目。
带有可选键的地图当然只是一个临时地图,以使其具有一定的可读性。
以老式/非 lambda 方式,我会这样做:
private Map<Price, String> getPricesForUserRelatedPrices(List<SpecialPrice> prices) {
Map<Price, String> existingPrices = new HashMap<>();
for(SpecialPrice p: prices){
Optional<Price> price = getPrice(p);
if(price.isPresent())
existingPrices.put(price.get(), getName(price));
}
return existingPrices;
}
有没有更优雅的方式?
是的,只有当你在推导出 existingPrices
之后完全放弃 pricesWithOptional
时,才有替代方案,这是从你已经达到的地方退一步。
Map<Price, String> existingPrices = prices.stream()
.map(p -> Map.entry(getPrice(p), getName(p))) // to avoid multiple calls to these
.filter(e -> e.getKey().isPresent())
.collect(Collectors.toMap(entry -> entry.getKey().get(),
Map.Entry::getValue));
注意:如果getPrice
和getName
都是昂贵的,除非你确定getPrice
的存在,我宁愿建议留在 for
循环以提高可读性。
Map<Price, String> existingPrices = new HashMap<>();
for (SpecialPrice specialPrice : prices) {
Optional<Price> price = getPrice(specialPrice);
if (price.isPresent()) {
String name = getName(specialPrice);
existingPrices.put(price.get(), name);
}
}