java - LINQ Join 的 Java 8 Stream API 等效项是什么?

标签 java c# .net linq join

在 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/

相关文章:

java - 如何检查硬件键盘是否可用? (黑莓)

ControlsFx ListSelection View 的 Java Swing 版本

c# - 在 C# 中解码 Base64 有时会给出一个额外的填充字符的错误结果

.net - 如何在 ClickOnce 应用程序中部署修补程序?

java - Android 应用程序中的二维码扫描仪

java - Spring Retry @Recover 传递参数

c# - 无法通过 FieldInfo 从 xaml 模板访问字段

c# - 在静态类中声明 char 数组

c# - 如何在本地测试 Azure 队列触发器函数?

.net - 如何在 DataGridView 中显示 DateTimePicker?