Java 8按数值接近度划分的流组条目

Java 8按数值接近度划分的流组条目,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个unix时间戳列表,例如: [1111111 1200000 1200060 1200120 1200180 1300000 1400000 140060] 我想将它们按集群进行分组,每个集群之间的间隔不超过60秒,密钥是第一个时间戳,例如: {1111111=[1111111], 1200000=[1200000,120060, 1200120], 1300000=[1300000], 1400060=[1400000, 1400060]} 我通过使用for循环实现了这一点,我希

我有一个unix时间戳列表,例如:

[1111111 1200000 1200060 1200120 1200180 1300000 1400000 140060]
我想将它们按集群进行分组,每个集群之间的间隔不超过60秒,密钥是第一个时间戳,例如:

{1111111=[1111111], 1200000=[1200000,120060, 1200120], 1300000=[1300000], 1400060=[1400000, 1400060]} 
我通过使用for循环实现了这一点,我希望有更好的方法,最好是使用Java8流

(我对Java不是很在行,所以如果没有一种使用流的方法,有没有更好的方法来构造for循环?)

List timestamps=new ArrayList();
时间戳。添加(1111111);
时间戳。添加(1200000);
时间戳。添加(1200060);
时间戳。添加(1200120);
时间戳。添加(1200180);
时间戳。添加(1300000);
时间戳。添加(1400000);
时间戳。添加(1400060);
HashMap grouped=新建HashMap();
列表子列表=新的ArrayList();
for(int i=0;i0&(timestamps.get(i-1)+60
要执行此操作,需要对与谓词匹配的流上的连续元素进行操作。不幸的是,目前没有标准的方法可以通过流API轻松实现这一点

StreamEx库为该功能提供了
groupRuns
操作。考虑到列表已经排序(否则,您可以通过调用
sorted()
)对其排序),您可以:

Map<Integer, List<Integer>> map =
    StreamEx.of(timestamps)
            .groupRuns((t1, t2) -> t2 - t1 <= 60)
            .toMap(l -> l.get(0), l -> l);

默认情况下,该方法将所有与给定谓词匹配的连续元素分组,并将所有这些元素收集到
列表中。在这种情况下,列表的第一个元素将是最终映射的键,列表本身将是值。

谢谢!我还没有机会尝试这个库,但我可以看到它确实做了需要的事情。遗憾的是流API不支持它
Map<Integer, List<Integer>> map =
    StreamEx.of(timestamps)
            .groupRuns((t1, t2) -> t2 - t1 <= 60)
            .toMap(l -> l.get(0), l -> l);
{1200000=[1200000, 1200060, 1200120, 1200180], 1300000=[1300000], 1400000=[1400000, 1400060], 1111111=[1111111]}