什么是LINQ Join的Java 8 Stream API等价物?
发布时间:2020-05-24 15:09:07 所属栏目:MsSql 来源:互联网
导读:在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.asp
|
在C#/ .Net中,可以使用扩展方法Enumerable.Join以SQL’JOIN … ON’方式连接IEnumerable序列. Java 8(Stream API)中有类似的东西吗?或者模拟Enumerable.Join的最佳方法是什么? 看到: 解决方法我还没有找到任何现有的等价物,但下面的方法应该有效:public static <Outer,Inner,Key,Result> Stream<Result> join(
Stream<Outer> outer,Stream<Inner> inner,Function<Outer,Key> outerKeyFunc,Function<Inner,Key> innerKeyFunc,BiFunction<Outer,Result> resultFunc) {
//Collect the Inner values into a list as we'll need them repeatedly
List<Inner> innerList = inner.collect(Collectors.toList());
//matches will store the matches between inner and outer
final Map<Outer,List<Inner>> matches = new HashMap<>();
//results will be used to collect the results in
final List<Result> results = new ArrayList<>();
outer.forEach(o -> innerList
.stream()
//Filter to get those Inners for which the Key equals the Key of this Outer
.filter(i -> innerKeyFunc.apply(i).equals(outerKeyFunc.apply(o)))
.forEach(i -> {
if (matches.containsKey(o)) {
//This Outer already had matches,so add this Inner to the List
matches.get(o).add(i);
} else {
//This is the first Inner to match this Outer,so create a List
List<Inner> list = new ArrayList<>();
list.add(i);
matches.put(o,list);
}
}));
matches.forEach((out,in) -> in.stream()
//Map each (Outer,Inner) pair to the appropriate Result...
.map(i -> resultFunc.apply(out,i))
//...and collect them
.forEach(res -> results.add(res)));
//Return the result as a Stream,like the .NET method does (IEnumerable)
return results.stream();
}
我只使用以下输入对代码进行了简短测试: public static void main(String[] args) {
Stream<String> strings = Arrays.asList("a","b","c","e","f","d").stream();
Stream<Integer> ints = Arrays.asList(1,2,3,6,5,4).stream();
Stream<String> results = join(strings,ints,Function.identity(),str -> Integer.parseInt(str,16) - 9,(o,i) -> "Outer: " + o + ",Inner: " + i);
results.forEach(r -> System.out.println(r));
}
> int是他们自己的键,所以没有转换 打印以下(正确)结果: Outer: a,Inner: 1 Outer: b,Inner: 2 Outer: c,Inner: 3 Outer: d,Inner: 4 Outer: e,Inner: 5 Outer: f,Inner: 6 当然,还需要进行更深入的测试,但我认为这种实施是正确的.它可能也更有效率,我愿意接受建议. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- SQL Server数据库分页存储过程代码
- sql-server – 将SQL Server列限制为可能的值列表
- mysql索引必须了解的几个重要问题
- SQL Server 2005 IsNumeric无法捕获’0310D45′
- sql-server-2008 – 从sql server 2000迁移到2008 r2 – 如
- sql-server – 哈希密钥探测和残差
- SQL Server 2005 RTM 安装错误 :The SQL Server System Co
- sql – 在IN()列表中找不到的那些
- SQL Server 批量插入数据的简单示例
- entity-framework – 使用Entity Framework创建数据库索引
推荐文章
站长推荐
热点阅读
