如何解决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);
完成此操作后,我仍然会坚持使用您所拥有的。有时,使用溪流就像用大铁锤钉钉子。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。