【发布时间】:2016-03-17 10:22:55
【问题描述】:
假设我有以下工作 lambda 表达式:
Map<Field, String> fields = Arrays.stream(resultClass.getDeclaredFields())
.filter(f -> f.isAnnotationPresent(Column.class))
.collect(toMap(f -> {
f.setAccessible(true);
return f;
}, f -> f.getAnnotation(Column.class).name()));
我想在过滤器语句之前创建一个具有 2 个值的流。所以我想做一个映射,但仍然保留原始值。我想实现这样的目标:
this.fields = Arrays.stream(resultClass.getDeclaredFields())
//map to <Field, Annotation> stream
.filter((f, a) -> a != null)
.collect(toMap(f -> {
f.setAccessible(true);
return f;
}, f -> a.name()));
这对 Java 8 流有可能吗?我看过 collect(groupingBy()) 但仍然没有成功。
【问题讨论】:
-
您可以提供地图供应商。该供应商可以提供一个已经有几个条目的地图。顺便说一句,你可以做
.peek(f -> f.setAccessible(true)) -
谢谢你,我不知道偷看。我有东西,我会在答案中发布,因为 cmets 确实不适用于代码。
-
它是
Stream<T>,因此必须随时在流中为T提供1 个具体类型。 Java 中目前没有魔法可以通过神奇地捕获像(f, a)这样的值来帮助动态创建此类类型。但这并不是一个不常见的问题,所以将来可能会发生变化。同时,有一些图书馆试图解决这个问题:jooq.org/products/jOO%CE%BB/javadoc/0.9.5/org/jooq/lambda/tuple/… -
是的,如果下一个 Java 版本提供类似的解决方案,那就太好了。我喜欢 jooq 框架,但目前我们没有足够的 lambda 函数来证明我们庞大的项目中还有另一个库。
标签: java java-stream