首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在java8函数样式中操作两个相邻的对象,请更改以下代码

如何在java8函数样式中操作两个相邻的对象,请更改以下代码
EN

Stack Overflow用户
提问于 2017-07-28 10:49:29
回答 2查看 77关注 0票数 1

后一个StaffOperInfo对象需要和前一个进行比较,如何将下面的代码改成java8风格呢?我的英文不好,希望你不要介意,谢谢!

代码语言:javascript
运行
复制
        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;
            }
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-28 12:53:01

Streams不会让你的代码变得更好。如果你的集合是一个列表或数组,下面是其中一种方法(如果不是,这将不起作用):

代码语言:javascript
运行
复制
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));
        });
票数 1
EN

Stack Overflow用户

发布于 2017-07-28 14:55:46

正如@Dark发布的那样,通过原生Stream API来做这件事并不容易。但是你可以试试StreamEx

代码语言:javascript
运行
复制
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);
    }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45364060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档