【发布时间】:2018-12-20 10:10:43
【问题描述】:
假设我有多个来自 obj_vx 类型的 java 对象,每个对象的日期时间不同(作为成员变量)。
obj_v1[D1]
obj_v1[D2]
obj_v1[D3]
obj_v1[D4]
obj_v2[D2]
obj_v2[D3]
obj_v2[D4]
obj_v3[D2]
obj_v3[D3]
obj_v3[D4]
obj_v4[D1]
obj_v4[D2]
obj_v4[D5]
obj_v5[D1]
obj_v5[D4]
obj_v5[D5]
obj_v5[D6]
obj_v5[D4]
obj_v5[D5]
or
obj_v1 [D1, D2, D3, D4]
obj_v2 [D2, D3, D4]
obj_v3 [D2, D3, D4]
obj_v4 [D1, D2, D5]
obj_v5 [D1, D4, D5, D6]
obj_v6 [D4, D5]
现在,我想过滤给定日期 D (with D1 obj_vx 与最年轻的日期时间 (D2 更年轻比 D1) 仍然比 D 更早(或等于)。 谁能告诉我,如何使用 Java-Stream-API 构建它?
Map-Reduce 操作返回 obj_vx 对象的列表。
回复:
- after 1st iteration
obj_v1 [D1, D2, D3]
obj_v2 [D2, D3]
obj_v3 [D2, D3]
obj_v4 [D1, D2]
obj_v5 [D1]
- after 2nd iteration
obj_v1[D3], obj_v2[D3], obj_v3[D3], obj_v4[D2], obj_v5[D1].
命题:
public class FilterTest {
static class X {
String group;
int y;
X(String group, int y) {
this.group = group;
this.y = y;
}
public String getGroup() {
return group;
}
public int getY() {
return y;
}
@Override
public String toString() {
return String.format("[group: '%s', y: '%s']", group, y);
}
}
public static void main(String[] args) {
int val = 2;
List<X> l = new ArrayList<>();
l.add(new X("A", 1));
l.add(new X("Y", 3));
l.add(new X("A", 2));
l.add(new X("Y", 1));
l.add(new X("B", 8));
l.add(new X("A", 3));
Map<String, X> map = l.stream().filter(d -> d.y <= val).collect(
Collectors.groupingBy(X::getGroup,
Collectors.collectingAndThen(
Collectors.reducing(
(X d1, X d2) -> d1.getY() > d2.getY() ? d1 : d2
),
Optional::get)));
System.out.println("m: " + map);
}
}
【问题讨论】:
-
我确实做到了,我只是想知道是否有更简单的方法来处理这个问题。我用我的提议更新了帖子,并用一个简单的对象 X 进行了测试
-
太棒了......你分享的代码有什么问题?
-
我猜我的问题,我不明白,我很确定没有人能理解它。就像我说的。我只是想知道一种最有可能构建这种结构的方法。我刚刚开始处理 Stream-API
-
恕我直言,您的解决方案应该只适用于您正在寻找的东西。只是一种更简洁的表示方式,可以possibly be this。
标签: java filter mapreduce java-stream