在 C#/.Net 中,可以使用扩展方法 Enumerable.Join 以 SQL“JOIN ... ON”方式连接 IEnumerable 序列。
Java 8 (Stream API) 中有类似的东西吗?或者模拟 Enumerable.Join 的最佳方法是什么?
参见: https://msdn.microsoft.com/en-us/library/bb534675%28v=vs.100%29.aspx
最佳答案
join is just syntactic sugar for Stream.flatMap()
as explained in this article .考虑这个例子:
List<Integer> l1 = Arrays.asList(1, 2, 3, 4);
List<Integer> l2 = Arrays.asList(2, 2, 4, 7);
l1.stream()
.flatMap(i1 -> l2.stream()
.filter(i2 -> i1.equals(i2)))
.forEach(System.out::println);
结果是:
2
2
4
在上面的例子中,flatMap()
对应于 (INNER) JOIN
而嵌套流的 filter()
操作对应于ON
子句。
jOOλ是一个库,它实现了 innerJoin()
和其他连接类型来对此进行抽象,例如如果您想加入两个 Stream
实例,而不是两个 Collection
实例,还可以缓冲流内容。使用 jOOλ,你可以这样写:
Seq<Integer> s1 = Seq.of(1, 2, 3, 4);
Seq<Integer> s2 = Seq.of(2, 2, 4, 7);
s1.innerJoin(s2, (i1, i2) -> i1.equals(i2))
.forEach(System.out::println);
... 打印出来(输出的是元组,更像SQL的semantics语义):
(2, 2)
(2, 2)
(4, 4)
(免责声明,我为 jOOλ 背后的公司工作)
关于java - LINQ Join 的 Java 8 Stream API 等效项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28616368/