首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用java 8转换为map (拆分spring并使键、对象的其他值作为值)

使用java 8转换为map (拆分spring并使键、对象的其他值作为值)
EN

Stack Overflow用户
提问于 2020-02-29 15:17:02
回答 2查看 504关注 0票数 0

我的Order类如下:

代码语言:javascript
复制
class Order {
    String orderId;
    String executionId;

    Order(String orderId, String executionId) {
        this.orderId = orderId;
        this.executionId = executionId;
    }

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public String getExecutionId() {
        return executionId;
    }

    public void setExecutionId(String executionId) { 
        this.executionId = executionId; 
    }
}
代码语言:javascript
复制
List<Order> orders =
                Arrays.asList( new Order("2", "23,21,25"),
                        new Order("4", "22,24"),
                        new Order("6", "27"),
                        new Order("2", "28,30"),
                        new Order("4", "29"),
                        new Order("5", "26"));

我需要按照下面的结构输出map对象,以获得与执行相关的命令。

代码语言:javascript
复制
Map<String, String> = {"23","2"},{"21","2"},{"25","2"},{"22","4"},{"24","4"},{"27","6"},{"28","2"},{"30","2"},{"29","4"},{"26","5"};

逗号分隔的值应视为映射键,对象的其他值应为值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-29 15:37:43

我会去做下面这样的事情-

代码语言:javascript
复制
    Map<String, String> flatMap = new HashMap<>();

    orders.forEach(order -> {
        String k = order.orderId;
        String values = order.executionId;

        for (String v : values.split(",")) {
            flatMap.put(v, k);
        }

    });

不是一种更简单的方法,而是更明智的可读性。

下面是一个不太可取的方法-

代码语言:javascript
复制
Map<String, String> flatMap = orders.stream()
        .map(order -> Arrays.stream(order.executionId.split(","))
                .collect(Collectors.toMap(Function.identity(), x -> order.orderId)))
        .flatMap(map -> map.entrySet().stream())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
票数 0
EN

Stack Overflow用户

发布于 2020-02-29 16:46:39

我想这就是你想要的。

代码语言:javascript
复制
        List<Order> orders = Arrays.asList(
                new Order("2", "23,21,25"),
                new Order("4", "22,24"), new Order("6", "27"),
                new Order("2", "28,30"), new Order("4", "29"),
                new Order("8", "26"), //<-- added this for demo
                new Order("5", "26"));

        Map<String, String> map = orders.stream()
                .flatMap(order -> Arrays
                        .stream(order.getExecutionId()
                                .split(","))
                        .map(a -> new String[] { a,
                                order.getOrderId() }))
                .collect(Collectors.toMap(info -> info[0], info -> info[1],
                        (value, oId) -> value + "," + oId,
                        LinkedHashMap::new));

        System.out.println(map);

它打印了以下内容:

{23=2,21=2,25=2,22=4,24=4,27=6,

28=2,30=2,29=4,26=8,5}

注意最后一项。这是一个合并函数,以防您以相同的键结束不同的值。把他们连在一起。如果你没有这种情况,把它留在里面也不会引起问题。

下面是使用嵌套循环和map.merge方法的相同结果,后者也是Java8。

代码语言:javascript
复制
        Map<String,String> map2 = new LinkedHashMap<>();
        for (Order order : orders) {
            for (String eId : order.getExecutionId().split(",")) {
                map2.merge(eId, order.getOrderId(), (value,oId)->  value + "," + oId);
            }
        }
        System.out.println(map2);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60466566

复制
相关文章

相似问题

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