我可以使用Stream将一个元素映射到多个元素吗?

时间:2018-03-13 15:56:01

标签: java java-stream

是否可以使用Java Streams将一个集合映射到另一个集合,但第二个集合必须具有与第一个集合不同的元素数量?

我有地图

"1" -> 10, "2-3" -> 20

并希望将其转换为

List<Node> = Node(1,10), Node(2,20), Node(3,20)

如何使用流程执行此操作?

我的代码是:

import com.google.common.collect.ImmutableMap;

import java.util.*;

import static java.util.stream.Collectors.toList;

public class MapOneToManyQuestion {

    public static void main(String[] args) {
        new MapOneToManyQuestion().run();
    }

    void run() {
        final Map<String, Integer> map = ImmutableMap.of("1", 10, "2-3", 20);

        List<Node> nodes = map.entrySet().stream().map(entry -> {
            if (Objects.equals(entry.getKey(), "1")) {
                return new Node(1, entry.getValue());
            } else {
                //return new Node(2, entry.getValue());
                //return new Node(3, entry.getValue());
            }
        }).collect(toList());
    }

    class Node {
        private Integer key;
        private Integer value;

        public Node(Integer key, Integer value) {
            this.key = key;
            this.value = value;
        }

        public Integer key() {
            return this.key;
        }

        public Integer value() {
            return this.value;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您可以使用flatMap来实现此目标

List<Node> nodes = map.entrySet()
        .stream()
        .flatMap(entry -> {
            String key = entry.getKey();
            Integer value = entry.getValue();
            return Arrays.stream(key.split("-"))
                    .map(splitKey -> new Node(Integer.valueOf(splitKey), value));
        })
        .collect(Collectors.toList());

它流过每个地图元素,并按-分割密钥,并为每个关键部分创建一个Node对象,该对象来自该条目的拆分和地图值,最后收集到一个清单。