将List <t>转换为Map <t.prop,list <t =“”>&gt;使用流API

时间:2017-09-08 15:09:33

标签: java lambda java-stream

考虑TGroup类,SOption类。

我有以下代码:

public static class Group {
    List<Option> options;

    public List<Option> getOptions() {
        return options;
    }

    public void setOptions(List<Option> options) {
        this.options = options;
    }

    public Group(List<Option> options) {
        this.options = options;
    }
}

public static class Option {
    int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Option(int id) {
        this.id = id;
    }
}

public static void main(String[] args) {
    final Option option1 = new Option(1);
    final Option option2 = new Option(2);
    final Option option3 = new Option(3);
    final Option option4 = new Option(4);
    final Option option5 = new Option(5);
    final Option option6 = new Option(6);
    final Group group1 = new Group(Arrays.asList(option1, option2));
    final Group group2 = new Group(Arrays.asList(option3, option4, option5, option6));        
}

我想创建Map,其中optionId是一个键,group将是一个值

因此它应该是

1 - group1
2 - group1
3 - group2
4 - group2
5 - group2
6 - group2

stream api是否允许解决此任务?

2 个答案:

答案 0 :(得分:2)

你可以这样做:

Stream.of(group1, group2)
    .flatMap(p -> p.getOptions().stream().map(q -> new Pair<>(p,q)))
    .collect(Collectors.toMap(
        p -> p.getValue().getId(), 
        p -> p.getKey()));
  • 首先获得群组
  • 然后将选项与它们配对
  • 然后将它们放入地图

此示例中的对是javafx.util.Pair,但如果首选,则可以使用其他对象。

答案 1 :(得分:0)

请尝试以下操作,但我认为您的输出3-6意味着是group2。

    final Map<Number,String> m = new HashMap<>();
    group1.getOptions().stream().forEach(p -> {m.put(p.getId(), "group1");});
    group2.getOptions().stream().forEach(p -> {m.put(p.getId(), "group2");});
    System.out.println(m);