java - 如何使用 Streams API 将实体列表映射到只有唯一列的单个实体?
问题描述
我有一种情况,我必须加入 OneToMany 映射的两个表。我想知道java 8 Stream中是否有一个API可以创建单个实体,左表中的列是普通成员,右表是值列表。
示例数据:
表格1
id name
1 abc
表 2
id table1_id note
1 1 qwerty
2 1 asdfgh
3 1 zxcvbn
加入这两个表。我得到这样的东西
select name, note from table1 join table2 on table2.table1_id=table1.id;
abc qwerty
abc asdfgh
abc zxcvbn
当前输出的 java 对象是以下类的列表
class NotesComments{
String name;
String notes;
}
预期输出是一个带有多个注释的 java 类:
class NotesComments{
String name;
List<String> notes;
}
解决方案
您可以使用基于 java - 8 的收集器 API 来执行此操作。
你可以看到这个例子
class Table2 {
int id;
int table1_id;
String note;
public Table2(int id, int table1_id, String note) {
this.id = id;
this.table1_id = table1_id;
this.note = note;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getTable1_id() {
return table1_id;
}
public void setTable1_id(int table1_id) {
this.table1_id = table1_id;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
}
class Table1 {
private int id;
private String name;
Table1(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// Table3Final - 正如您在问题中提到的那样。
Stream<Table1> table1List = Stream.of(new Table1(1, "abc"));
Stream<Table2> table2List = Stream.of(new Table2(1, 1, "qwerty"),
new Table2(2, 1, "asdfgh"),
new Table2(3, 1, "zxcvbn"));
Stream<Table3Final> table3GeneratedStream = table1List
.flatMap(en -> table2List
.filter(table2Entry -> en.getId() == table2Entry.getTable1_id())
.collect(Collectors.groupingBy(Table2::getTable1_id, Collectors.mapping(Table2::getNote, Collectors.toList())))
.entrySet()
.stream()
.map(mapEntry -> new Table3Final(en.getName(), mapEntry.getValue())));
/*System.out.println(table3GeneratedStream.count());*/
table3GeneratedStream.forEach(entry -> {
System.out.println("--------------Name---------------------------");
System.out.println(entry.getName());
System.out.println("----------------Notes-------------------------");
entry.notes.forEach(System.out::println);
});
推荐阅读
- javascript - 如何在javascript中为蛇添加头部
- javascript - 更新后如何重新渲染 Formik 值 - React Native?
- github - 我可以将其他 git 存储库导入到我的存储库吗?
- ios - 我们如何使用 swiftUI 获取数据并像 viewdidload 一样显示
- python - 在 Pandas 中按数据类型处理数据
- batch-file - 带有批处理文件的 Veracrypt:如果未安装驱动器,如何停止执行?
- javascript - 循环后 Node.js 似乎没有释放内存
- swift - 以编程方式动态单元格高度
- c++ - 使用 C++ 创建特殊的二叉搜索树
- angular - 在 ng serve 构建 Angular 库