如何映射到多个元素并收集

时间:2017-05-22 12:56:35

标签: java java-8 java-stream

final List<Toy> toys = Arrays.asList("new Toy(1)", "new Toy(2)"); 

final List<Item> itemList = toys.stream()
   .map(toy -> {
        return Item.from(toy); //Creates Item type
   }).collect(Collectors.toList);

以上编码会对罚款产生罚款,并会从玩具列表中列出一个项目列表。

我想做的是这样的事情:

final List<Item> itemList = toys.stream()
   .map(toy -> {
        Item item1 = Item.from(toy);
        Item item2 = Item.fromOther(toy);

        List<Item> newItems = Arrays.asList(item1, item2);
        return newItems;
   }).collect(Collectors.toList);

OR

final List<Item> itemList = toys.stream()
   .map(toy -> {
        return Item item1 = Item.from(toy); 
        return Item item2 = Item.fromOther(toy); //Two returns don't make sense but just want to illustrate the idea.       
   }).collect(Collectors.toList);

因此,将此与第一个代码进行比较,第一种方法为每个玩具对象返回1个Item对象。

我如何制作它以便为每个玩具返回两个物品对象?

- UPDATE -

final List<Item> itemList = toys.stream()
   .map(toy -> {
        Item item1 = Item.from(toy);
        Item item2 = Item.fromOther(toy);

        return Arrays.asList(item1,item2);
   }).collect(ArrayList<Item>::new, ArrayList::addAll,ArrayList::addAll);

2 个答案:

答案 0 :(得分:4)

你已经这样做了......你只需要flatMap

final List<Item> itemList = toys.stream()
.map(toy -> Arrays.asList(Item.from(toy),Item.fromOther(toy))
.flatMap(List::stream)
.collect(Collectors.toList());

或者您完全按照建议删除映射:

final List<Item> itemList = toys.stream()
.flatMap(toy -> Stream.of(Item.from(toy),Item.fromOther(toy))))
.collect(Collectors.toList());

答案 1 :(得分:1)

如果您希望为每个玩具返回两个项目,输出类型可能应为List<List<Item>>

List<List<Item>> itemList = 
    toys.stream()
        .map(toy -> Arrays.asList(Item.from(toy),Item.fromOther(toy)))
        .collect(Collectors.toList);

如果您希望将每个Item的{​​{1}}个Toy收集到同一个List<Item>中,请使用flatMap

List<Item> itemList = 
    toys.stream()
        .flatMap(toy -> Stream.of(Item.from(toy),Item.fromOther(toy)))
        .collect(Collectors.toList);