后一个StaffOperInfo对象需要和前一个进行比较,如何将下面的代码改成java8风格呢?我的英文不好,希望你不要介意,谢谢!
StaffOperInfo before = null;
for (StaffOperInfo so : staffMap.get(staffId)) {
if (before == null) {
before = so;
} else {
if (so.getTermIp()!=null&&!so.getTermIp().equals(before.getTermIp())
&& so.getAcceptDate().getTime()-
before.getAcceptDate().getTime()<step*1000) {
if (filterMap.containsKey(staffId)) {
filterMap.get(staffId).add(before);
filterMap.get(staffId).add(so);
} else {
List<StaffOperInfo> ll = new ArrayList<>();
ll.add(before);
ll.add(so);
filterMap.put(staffId, ll);
}
}
before = so;
}
}
发布于 2017-07-28 12:53:01
Streams不会让你的代码变得更好。如果你的集合是一个列表或数组,下面是其中一种方法(如果不是,这将不起作用):
List<StaffOperInfo> list = staffMap.get(staffId);
IntStream.range(1, list.size() - 1) // Stream on Indices of the List
.mapToObj(i -> new StaffOperInfo[]{list.get(i - 1), list.get(i)}) // Get pair of StaffOperInfo
.filter(arr -> !Objects.equals(arr[0].getTermIp(), arr[1].getTermIp()) // Filter pairs based on your if condition
&& (arr[1].getAcceptDate().getTime() - arr[0].getAcceptDate().getTime() < step * 1000))
.forEach(arr -> {
if (filterMap.containsKey(staffId))
filterMap.get(staffId).addAll(Arrays.asList(arr));
else
filterMap.put(staffId, Arrays.asList(arr));
});
发布于 2017-07-28 14:55:46
正如@Dark发布的那样,通过原生Stream API来做这件事并不容易。但是你可以试试StreamEx
StreamEx.of(staffMap.get(staffId)).forPairs((before, so) -> {
if (so.getTermIp()!=null&&!so.getTermIp().equals(before.getTermIp())
&& so.getAcceptDate().getTime()-
before.getAcceptDate().getTime()<step*1000) {
List<StaffOperInfo> ll = filterMap.computeIfAbsent(staffId, k -> new ArrayList<>());
ll.add(before);
ll.add(so);
}
});
https://stackoverflow.com/questions/45364060
复制相似问题