Java 8流在包含字符串

问题描述

我不太熟悉Java 8(仍在学习),并希望了解是否可以使用流找到与以下代码等效的东西。

下面的代码主要尝试获取每个人的标签,然后根据该标签对他们进行分组。一个人可以与多个标签相关联-如果这是重复的,请告诉我:( 我无法在线找到解决方案。

我要简化的部分 安全假设-无需空检查

Map<Tag,List<String>> tagPersonListMap = new HashMap<>();
for (Person person: personList) {
    List<Tag> tags = person.getTags();
    String id = person.getId();
    for(Tag tag: tags) {
        tagPersonListMap.computeIfAbsent(tag,k ->new ArrayList<>()).add(id);
    }
}

完整代码供参考

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Scratch {
    public static void main(String[] args) {
        Person person1 = new Person(Arrays.asList(Tag.EMPLOYEE,Tag.UNKNowN),"123");
        Person person2 = new Person(Arrays.asList(Tag.UNKNowN,Tag.VISITOR),"345");
        Person person3 = new Person(Arrays.asList(Tag.VISITOR),"678");
        Person person4 = new Person(Arrays.asList(Tag.EMPLOYEE,"910");
        List<Person> personList = Arrays.asList(
            person1,person2,person3,person4
        );

        Map<Tag,List<String>> tagPersonListMap = new HashMap<>();
        for (Person person: personList) {
            List<Tag> tags = person.getTags();
            String id = person.getId();
            for(Tag tag: tags) {
                tagPersonListMap.computeIfAbsent(tag,k ->new ArrayList<>()).add(id);
            }
        }

        System.out.println("Final result: " + tagPersonListMap);
    }
}

enum Tag {
    EMPLOYEE("employee"),VISITOR("visitor"),UNKNowN("unkNown");
    private final String mValue;
    private Tag(String value) {
        this.mValue = value;
    }
}

class Person {
    List<Tag> tags;
    String id;

    Person (List<Tag> tag,String i) {
        tags = tag;
        id = i;
    }

    List<Tag> getTags() {
        return tags;
    }

    String getId() {
        return id;
    }
}

预期产量

Final result: {EMPLOYEE=[123,910],UNKNowN=[123,345,VISITOR=[345,678]}

解决方法

您可以这样做。为此,我基本上将标签列表和ID转换为Map.Entry的{​​{1}}对象。因此,如果有四个标记和一个ID,则将是四个条目。然后,我简单地按(Tag tag,String id)将它们分组,并将其值设为Tag

List<String>

打印

Map<Tag,List<String>> result = personList.stream()
        .flatMap(per -> per.getTags().stream()
                .map(tag -> Map.entry(tag,per.getId())))
                .collect(Collectors.groupingBy(Entry::getKey,Collectors.mapping(Entry::getValue,Collectors.toList())));

result.entrySet().forEach(System.out::println);

完成此操作后,我仍然会坚持使用您所拥有的。有时,使用溪流就像用大铁锤钉钉子。