我有一个Set<DateCount>
我使用下面的代码创建。这将创建一组7 DateCount
对象,初始计数为0,从当天开始的当天每一天为一个对象。如何组合不同于Java流8
// 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[]
在索引0处具有BigDecimal
,在索引1处具有Long
。BigDecimal
实际上是日期,类似20141001
。我想知道的是,如果有一种方式,我可以更新使用Stream数据中的这些数据设置的dateCounts
。现在,我正在执行以下操作,它只是遍历对象数组列表并创建新的DateCount
对象,然后将其添加到dateCounts
集合中。 DateCount
类具有自定义equals()
和hashCode()
方法,以确保dateCounts
集合在任何给定日期只包含一个DateCount
实例。
在一个侧面说明,我不知道是否还有一个方式,以避免在做我的lambda表达式一个try/catch只是解析String
到Date
。
更新 - 这是我到目前为止所提出的。虽然在.map调用中流过List<Object[]>
似乎并不自然,但不确定是否有更好的方法。我介绍了我自己的Tuple<X, Y>
类,因为在流中使用Object[]
不会很好,因为没有访问方法。同样在最后2行中,我将创建一个TreeSet
,并使用Comparator
,以便我可以按日期对数据进行排序。我不觉得这是最好的方法,但我试着拨打sorted()
并使DateCount
实现Comparable
,这似乎工作正常,但只要collect(toSet())
方法被调用,排序就会消失。我认为这是一个流式呼叫的本质。我很好奇在收集方法调用之前是否有办法对它进行排序,并在调用collect之后保留排序。
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);
谢谢,供应商的方法看起来不错。我主要感到不舒服的是数据'data.stream()'的嵌套流式传输。看起来你不需要映射到我最初的'mapToObj'中的'Tuple'。我会看看groupingBy方法。谢谢 :) – 2014-10-02 14:06:55