2017-09-08 46 views
1

考虑到TGroup类和SOption类。转化列表<T>到地图<T.Prop,列表<T>>使用流API

我有以下代码:

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));   
} 

我要创建地图,optionId将是一个关键和组将是一个价值

因此它应该是

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

不流API允许解决这个任务?

+0

这些例子是正确的,还是3-6的意思是2,我的答案是基于假设的例子是错的 – jrtapsell

回答

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,尽管其他人可以在其位置使用,如果愿意。

+0

什么是Pair类? – gstackoverflow

+1

你应该考虑重命名流变量。而不是'p'和'q',诸如'''''''option''或'pair'这样的名字更具可读性。 – basst314

+0

@gstackoverflow我认为他引用了[Apache Commons Pair-Class](https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/tuple/Pair.html) – basst314

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);