首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java列表上流以填充Map

在Java列表上流以填充Map
EN

Stack Overflow用户
提问于 2021-12-08 16:08:49
回答 2查看 85关注 0票数 0

这里是Java 11。下面是POJO:

代码语言:javascript
复制
@Data // Lombok; adds getters, setters, all-args constructor and equals and hashCode
public class Fliflam {
    private String merf;
    private String tarf;
    private Boolean isFlerf;
}

我有一个验证Flimflam的方法,并返回在验证Flimflam时遇到的任何错误的List<String>。如果出于某些原因,我可以将其更改为返回Optional<List<String>>,特别是在处理Stream时:

代码语言:javascript
复制
public List<String> validateFlimflam(Flimflam flimflam) {
    List<String> errors = new ArrayList<>();

    // ... validation code omitted for brevity
    // 'errors' list is populated with any errors; otherwise it returns empty

    return errors;
}

我希望流(Stream )通过一个List<Flimflam>并填充一个Map<Flimflam,List<String>>错误映射,其中映射的键是一个验证失败的Flimflam,它的相应值是验证错误字符串的列表。

我可以用这样的“老式”方式来实现这一目标:

代码语言:javascript
复制
List<Flimflam> flimflams = getSomehow();
Map<Flimflam,List<String>> errorsMap = new HashMap<>();
for (Flimflam ff : flimflams) {
    List<String> errors = validateFlimflam(ff);
    if (!errors.isEmpty() {
        errorsMap.put(ff, errors);
    }
}

如何通过Stream实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-08 16:18:13

像这样

代码语言:javascript
复制
Map<Flimflam,List<String>> errorsMap = flimflams.stream().collect(Collectors.toMap(f -> f, f-> f::validateFlimflam));

toMap接受2个参数(keyMapper,valueMapper),在您的示例中,密钥映射程序是来自流本身的对象,而值是在该对象上调用validateFlimflam。

票数 1
EN

Stack Overflow用户

发布于 2021-12-08 17:20:04

很难说您的validateFlimflam方法是在哪里定义的。我怀疑它不在Flimflam类本身中,因为不需要将其自身的一个实例传递给该方法。所以我认为它是那个类的一个外部方法。假设我将按以下方式进行:

thisClass =包含validateFlimflam的实例。可以设置为this

代码语言:javascript
复制
Map<Flimflam, List<String>> errorsMap =
        flimflams.stream().collect(Collectors.toMap(f -> f,
                        thisClass::validateFlimflam));

如果偶然地,Flimflam确实包含了validateFlimflam,那么您可以这样做。请注意,这假定该方法不使用参数,因为它们不是必要的

代码语言:javascript
复制
Map<Flimflam, List<String>> errorsMap =
        flimflams.stream().collect(Collectors.toMap(f -> f,
                        Flimflam::validateFlimflam));

最后,如果包含类是其他类,并且validateFlimflam方法声明为静态的,那么您可以这样做,方法是使用包含的类名而不是实例。而且,在这种情况下,该方法将接受定义的参数。

代码语言:javascript
复制
Map<Flimflam, List<String>> errorsMap =
        flimflams.stream().collect(Collectors.toMap(f -> f,
                        SomeClass::validateFlimflam));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70278160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档