gpt4 book ai didi

java - 处理列表流并收集到只有非空值的 map/ImmutableMap

转载 作者:搜寻专家 更新时间:2023-11-01 02:38:57 25 4
gpt4 key购买 nike

如何处理字符串列表并将其收集到 Map 或 Immutable map 中,只为那些存在值的字符串

String anotherParam = "xyz";
Map.Builder<String,String> resultMap = ImmutableMap.builder(..)

listOfItems.stream()
.filter(Objects::nonNull)
.distinct()
.forEach(
item -> {
final Optional<String> result =
getProcessedItem(item,anotherParam);

if (result.isPresent()) {

resultMap.put(item, result.get());
}
});
return resultMap.build();

请问有没有更好的方式通过collect来实现?

最佳答案

如果您有权访问 Apache Commons 库,则可以使用 Pair.class

Map<String, String> resultMap = ImmutableMap.copyof(listOfItems()
.stream()
.filter(Objects::nonNull)
.distinct()
.map(it -> Pair.of(it, getProcessedItem(it,anotherParam))
.filter(pair -> pair.getValue().isPresent())
.collect(toMap(Pair::getKey, pair -> pair.getValue().get())))

但是创建特殊的数据类来描述您的映射项->更具体的结果是一个很好的做法

这里是一个例子,创建这样的类:

static class ItemResult(){
public final String item;
public final Optional<String> result;

public ItemResult(String item, Optional<String> result){
this.item = item;
this.result = result;
}

public boolean isPresent(){
return this.result.isPresent();
}

public String getResult(){
return result.get();
}
}

然后像那样使用它:

Map<String, String> resultMap = ImmutableMap.copyOf(listOfItems()
.stream()
.filter(Objects::nonNull)
.distinct()
.map(it -> new ItemResult(it, getProcessedItem(it,anotherParam))
.filter(ItemResult::isPresent)
.collect(toMap(ItemResult::item, ItemResult::getResult)))

您可以阅读 here为什么 Google 放弃了元组和对的想法并且在大多数情况下不使用它们

如果你毕竟不想使用任何其他类,你可以利用 Optional 的 api:

Map.Builder<String,String> resultMap = ImmutableMap.builder(..)

listOfItems.stream()
.filter(Objects::nonNull)
.distinct()
.forEach(item -> getProcessedItem(item,anotherParam)
.ifPresent(result -> resultMap.put(item result));
return resultMap.build();

关于java - 处理列表流并收集到只有非空值的 map/ImmutableMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39115194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com