Java8流-要列表的嵌套映射
我有两张单子。第一个列表中的项目必须与第二个列表进行比较,并且必须构建新列表 样本输入Java8流-要列表的嵌套映射,java,list,java-8,hashmap,java-stream,Java,List,Java 8,Hashmap,Java Stream,我有两张单子。第一个列表中的项目必须与第二个列表进行比较,并且必须构建新列表 样本输入 firstlist .stream() .map( x -> { return secondList .stream() .map( y -> { //return a string } ) .collect(Collectors.toList()) // "Output"
firstlist
.stream()
.map( x -> {
return secondList
.stream()
.map( y -> { //return a string } )
.collect(Collectors.toList()) // "Output" I need
}
)
.//Get the "Output" here
输出:
List 1 : [ { "id" ; 3, "names" : ["test","test2"] }]
List 2 : [ {"name": :"test" , "age" :3}]
注意:第一个列表中的
名称应与第二个列表中的名称进行核对这是您要找的吗
List 3 : [ {"id" : 3, "name" : "test", "age" :3} ]
你需要这样的东西:
firstList
.stream()
.filter(item -> secondList
.stream().anyMatch(item::matches))
.collect(Collectors.toList());
对于注释,我使用Lombok,因为您的属性非常通用,我认为您最好引入一些自定义类来替换映射
,并满足您的要求,下面是一个简单的演示,用于您问题中的输入和输出:
[ObjectC(id=3, name=test, age=3)]
您可能需要以下内容:
[id: 3, name: test, age: 3]
班级成绩
private String name;
private int age;
你能给我们看一些输入输出吗?你的问题不清楚你合并的标准是什么?用输入和输出示例编辑了我的问题。@madhairsilence你能为这两个列表分享POJO
吗?@madhairsilence->你几乎忽略了所有要求澄清问题和答案的评论。如果您想要一个可用的解决方案,您应该学会与我们合作,并向我们提供所需的信息。但这不是真正的匹配。是第一个列表中的属性应该与第二个列表中的属性匹配吗?我得到java.lang.ClassCastException:java.util.LinkedHashMap不能强制转换为ObjectC@madhairsilence你能告诉我们你是如何填写清单的吗?从问题中,我假设您使用的是对象而不是地图,因此请编辑您的问题,并向我们提供您如何填写此列表,关于错误,这是一个逻辑,您似乎混合了我的数据类型和您的数据类型。对于此错误,我正在等待您的编辑。确定。一个小错误。实际错误是我获取java.lang.ClassCastException:java.util.LinkedHashMap不能转换为“ObjectA”。而我面临的例外恰恰是“收集”。如果我删除它,代码会正常运行hi@madhairseem仔细听,你能给我们看看你的代码吗?我不能不看你的密码就回答!我更喜欢一个更圆滑的版本。
public class SimpleFlatMap {
public static void main(String... args) {
List<EntityWithNames> listOne = new ArrayList<>();
listOne.add(new EntityWithNames());
List<EntityWithAge> listTwo = new ArrayList<>();
listTwo.add(new EntityWithAge("test", 3));
List<EntityWithNameAndAge> listThree = listOne.stream().map(withNames -> {
EntityWithAge entityWithAge = listTwo.stream()
.filter(withAge -> withNames.names.contains(withAge.name))
.findAny()
.orElse(new EntityWithAge());
return new EntityWithNameAndAge(withNames.id, entityWithAge.name, entityWithAge.age);
}).collect(Collectors.toList());
System.out.println(listThree);
}
static class EntityWithNames {
Long id;
List<String> names;
public EntityWithNames() {
id = 3L;
names = new ArrayList<>(Arrays.asList("test", "test1"));
}
}
static class EntityWithAge {
String name;
int age;
public EntityWithAge() {
name = "default";
age = -1;
}
public EntityWithAge(String name, int age) {
this.name = name;
this.age = age;
}
}
static class EntityWithNameAndAge {
Long id;
String name;
int age;
public EntityWithNameAndAge(Long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return String.format("id: %d, name: %s, age: %d", id, name, age);
}
}
}
[id: 3, name: test, age: 3]
List<ClassWithId> list1 = new ArrayList<>();
List<ClassWithAge> list2 = new ArrayList<>();
list1.add(new ClassWithId(3, Arrays.asList("test", "test2")));
list2.add(new ClassWithAge("test", 4));
List<ClassResult> list3 = list2.stream()
.map(i -> new ClassResult(
list1.stream()
.filter(j -> j.getList().contains(i.getName()))
.map(j -> j.getId())
.findFirst().get(),
i.getName(), i.getAge()))
.collect(Collectors.toList());
private int id;
private List<String> list;
private String name;
private int age;
private int id;
private int age;
private String name;