使用Java流的2D映射

使用Java流的2D映射,java,java-stream,Java,Java Stream,我正在学习Java Streams,希望用Java 8特性替换下面的代码 我有一个带有X和Y坐标以及方向箭头的点列表: final List<PathStep> path; 最终列表路径; 我想将上面的列表转换为地图地图,如以下Java 7代码所示: final Map<Integer, Map<Integer, Direction>> map = new HashMap<>(); for (final PathStep pa

我正在学习Java Streams,希望用Java 8特性替换下面的代码

我有一个带有X和Y坐标以及方向箭头的点列表:

final List<PathStep> path;
最终列表路径;
我想将上面的列表转换为地图地图,如以下Java 7代码所示:

    final Map<Integer, Map<Integer, Direction>> map = new HashMap<>();

    for (final PathStep pathStep : path) {
        final Coordinate coordinate = pathStep.getCoordinate();
        final int y = coordinate.getY();

        if (!map.containsKey(y)) {
            map.put(y, new HashMap<>());
        }

        final Map<Integer, Direction> mapY = map.get(y);
        mapY.put(coordinate.getX(), pathStep.getDirection());
    }
final Map=new HashMap();
用于(最终路径步骤路径步骤:路径){
最终坐标=pathStep.getCoordinate();
final int y=coordinate.getY();
如果(!map.containsKey(y)){
put(y,newhashmap());
}
最终映射mapY=Map.get(y);
put(coordinate.getX(),pathStep.getDirection());
}
我能够使用stream.filter()和stream.map特性,但是我不能用Java8特性替换上面的代码


任何提示都将不胜感激

您可以使用
groupingBy()
和嵌套的
toMap()
进行收集。假设
路径
集合

final Map=path.stream().collect(
收集者分组(
步骤->步骤.getCoordinate().getY(),
汤姆(
步骤->步骤.getCoordinate().getX(),
步骤->步骤.getDirection());

虽然这不是一个典型的有效问题,因为您没有尝试使用
编写此问题,但很可能有人会帮您回答。如果只是为了证明我真的花了数小时试图找出一种方法而将我的问题抛诸脑后,那又有什么好处呢?我最终得到了一张地图(y->coords),而我想要一张地图的地图(y->(x->方向))…我只是把它指出来。通常这个网站的运作方式是:你提供你的尝试,SO成员会指出你错在哪里,或暗示(或以其他方式)如何纠正。请你展示你的尝试,@PetrSládek,(至少)有两个目的:(i)阻止那些确实没有花费大量时间试图自己解决问题的人,以及(ii)使我们能够向您提供更有针对性的反馈。有时,这也有助于澄清所问的问题,尽管在你的特殊情况下,这方面似乎没有任何不确定性。这就是我所需要的!
groupingBy
中的
toMap
工作起来很神奇!我不知道我能那样使用它。只需注意,我添加了一个方法引用
PathStep::getDirection
,而不是
step.getDirection()
。非常感谢你!
final Map<Integer, Map<Integer, Direction>> map = path.stream().collect(
        Collectors.groupingBy(
                step -> step.getCoordinate().getY(),
                Collectors.toMap(
                        step -> step.getCoordinate().getX(),
                        step -> step.getDirection())));