[英]inner join in java using streams
我有兩個列表地圖:
命令
[
{
item_id=1,
item=item-1,
user_id=1
},
{
item_id=2,
item=item-2,
user_id=2
},
{
item_id=3,
item=item-3,
user_id=3
}
]
用戶
[
{
user_id=1,
name=abh,
email=abh@bit.com
},
{
user_id=2,
name=pol,
email=pol@bit.com
},
{
user_id=3,
name=tre,
email=tre@bit.com
}
]
它們被初始化為
List<Map<String, String>> data
我想使用Streams在此List Maps上進行sql等效內連接。
我試過這個:
List<Map<String, String>> collect = leftData.stream().flatMap(t1 -> rightData.stream())
.filter(t -> t.get(joinColumnTableLeft).equals(t.get(joinColumnTableRight)))
.collect(Collectors.toList());
這給了我一個尺寸大小(用戶)*大小(訂單)的結果,這是9.並且收集有orders
。
但是我想要將Map合並為單個,然后創建一個列表。
截至目前無法使用任何庫。
假設您沒有重復的條目(通過合並列鍵),您可以使用這樣的方法進行合並。
這將在其中一個列表中按行創建mergeColumn
鍵到完整地圖的映射,然后在通過迭代其他映射進行合並時將其用於查找。
static List<Map<String, String>> merge(List<Map<String, String>> left,
List<Map<String, String>> right, String joinColumnTableLeft,
String joinColumnTableRight) {
Map<String, Map<String, String>> rightById = right.stream()
.collect(Collectors.toMap(m -> m.get(joinColumnTableRight),
Function.identity()));
return left.stream()
.filter(e -> rightById.containsKey(e.get(joinColumnTableLeft)))
.map(l -> {
Map<String, String> all = new HashMap<>();
all.putAll(l);
all.putAll(rightById.get(l.get(joinColumnTableLeft)));
return all;
})
.collect(Collectors.toList());
}
作為測試:
Map<String, String> left1 = new HashMap<>(), right1 = new HashMap<>();
left1.put("a", "A");
left1.put("b", "B");
left1.put("c", "C");
right1.put("a", "A");
right1.put("d", "B");
Map<String, String> left2 = new HashMap<>(), right2 = new HashMap<>();
left2.put("a", "AA");
left2.put("b", "BB");
left2.put("c", "CC");
right2.put("a", "AA");
right2.put("d", "BB");
System.out.println(merge(Arrays.asList(left1, left2),
Arrays.asList(right1, right2), "a", "a"));
輸出為: [{a=A, b=B, c=C, d=B}, {a=AA, b=BB, c=CC, d=BB}]
但是,條目的順序並不重要。 請注意,這假設除了連接列之外沒有重疊鍵。 否則,您可能希望收集地圖對,而不是在新地圖上調用putAll
。
以下內容將支持重復的連接鍵(並將為每個鍵生成所有條目的笛卡爾積):
static List<Map<String, String>> merge(List<Map<String, String>> left,
List<Map<String, String>> right,
String joinColumnTableLeft, String joinColumnTableRight) {
Map<String, List<Map<String, String>>> rightById = right.stream()
.collect(Collectors.groupingBy(m -> m.get(joinColumnTableRight)));
return left.stream()
.filter(e -> rightById.containsKey(e.get(joinColumnTableLeft)))
.flatMap(l -> rightById.get(l.get(joinColumnTableLeft)).stream()
.map(r -> {
Map<String, String> all = new HashMap<>();
all.putAll(l);
all.putAll(r);
return all;
}
)
).collect(Collectors.toList());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.