我有一个Set<DateCount>
我使用以下代码创建的。这将创建一组 7 个DateCount
初始计数为 0 的对象,从当天开始,本周的每一天都有一个对象。
// Create an initial Set of DateCount objects for the current week with counts of 0
Set<DateCount> dateCounts = IntStream.range(0, DAYS_IN_WEEK)
.mapToObj(idx -> new DateTime().withTimeAtStartOfDay().plusDays(idx))
.map(dt -> new DateCount(dt.toDate(), 0L))
.collect(toSet());
我有一个List<Object[]>
这是从数据库存储库返回的。每个Object[]
列表中有一个BigDecimal
在索引 0 和 a 处Long
在索引 1 处。BigDecimal
实际上是一个日期,比如20141001
。我想知道是否有办法可以更新dateCounts
以 Stream 方式使用此数据进行设置。现在,我正在执行以下操作,它只是迭代对象数组列表并创建新的DateCount
然后将对象添加到dateCounts
放。这DateCount
班级有一个习惯equals()
and hashCode()
方法来确保dateCounts
集合仅包含一个DateCount
任何给定日期的实例。
data.stream()
.forEach(obj -> {
DateTime date = null;
try {
date = (sdf == null) ? new DateTime(obj[0]) : new DateTime(sdf.parse(obj[0].toString()));
dateCounts.add(new DateCount(date.toDate(), (Long) obj[1]));
} catch (ParseException e) {
e.printStackTrace();
}
});
顺便说一句,我想知道是否还有一种方法可以避免在 lambda 表达式中仅用于解析String
to a Date
.
Update——这是我目前想到的。尽管流式传输似乎并不自然List<Object[]>
在 .map 调用中,不确定是否有更好的方法。我介绍了我自己的Tuple<X, Y>
类,因为与Object[]
由于没有访问器方法,在流中工作得不太好。同样在最后两行中,我正在创建一个TreeSet
with a Comparator
这样我就可以按日期对数据进行排序。我不认为这是最好的方法,但我尝试打电话sorted()
并制作DateCount
实施Comparable
这似乎工作正常,但一旦collect(toSet())
调用方法后,排序就会消失。我认为这就是流式通话的本质。我很好奇是否有一种方法可以在调用收集方法之前对其进行排序并在调用收集之后保留排序。
Set<DateCount> dateCounts = IntStream.range(0, DAYS_IN_WEEK)
.mapToObj(idx -> new Tuple<>(new DateTime().withTimeAtStartOfDay().plusDays(idx).toDate(), 0L))
.map(t -> {
Tuple<String, Long> d = data.stream()
.map(arr -> new Tuple<>(arr[0].toString(), (Long) arr[1]))
.filter(tuple -> sdf.format(t.getX()).equals(tuple.getX()))
.findFirst().orElse(new Tuple<>(sdf.format(t.getX()), 0L));
return new DateCount(DateTime.parse(d.getX(), DateTimeFormat.forPattern("yyyyMMdd")).toDate(), d.getY());
})
.collect(toSet());
TreeSet<DateCount> set = new TreeSet<>((a, b) -> a.compareTo(b));
set.addAll(dateCounts);