【问题标题】:Java8 Stream: groupingBy and create MapJava8 Stream:groupingBy和创建地图
【发布时间】:2021-03-10 18:07:09
【问题描述】:

我想得到如下数据结构:Map>

Given 是一个包含字段 als 基元(位置、目的地、距离)或作为键(位置)加地图(目标)的类。从每个独特的位置可以定位到许多目的地(按距离)。

private static class LocationPair {
    String position, destination;
    int distance;
}

Map<String, Map<String, Integer>> locations = locationPairs.stream()
    .collect(Collectors.groupingBy(pair -> pair.position, Collectors.toMap(pair.destination, pair.distance)));
private static class LocationPair {
     String position;
     Map<String, Integer> target = Collections.singletonMap(destination, distance);
}

Map<String, Map<String, Integer>> locations = locationPairs.stream()
    .collect(Collectors.groupingBy(pair -> pair.position, Collectors.mapping(pair -> pair.target)));

关于第二个代码-sn-p:结果应该和第一个代码一样。唯一的区别是LocationPair中提供的数据经过进一步处理,因此目的地和距离已经放入它们的目标地图。

我知道这一定是可能的,但不知何故我无法弄清楚如何完成它。上面的流代码 sn-ps 将显示我的意思,尽管我知道它们不起作用。

非常感谢您的帮助

【问题讨论】:

  • 第一个LocationPair类中没有target字段
  • 信息坦克,WJS

标签: java groupingby


【解决方案1】:

代码大部分看起来是正确的。稍作调整即可使其正常工作。

        public static Map<String, Map<String, Integer>> locations(List<LocationPair> locationPairs) {
            return locationPairs.stream()
                    .collect(
                            Collectors.groupingBy(LocationPair::getPosition, Collectors.toMap(LocationPair::getDestination, LocationPair::getDistance)));
        }

使用变量而不是方法引用,这就变成了-

locationPairs.stream()
                    .collect(
                            Collectors.groupingBy(tmp -> tmp.position, Collectors.toMap(tmp2 -> tmp2.destination, tmp2 -> tmp2.distance)));

希望这会有所帮助。如果我错过了什么,请告诉我

【讨论】:

  • 您是否可以为第二个样本提供代码 sn-p,其中分组数据已作为地图传递?
  • @Slevin 第二个代码不清楚。您能否编辑问题以更好地解释它?
  • 结果应该和第一个代码中的一样。唯一的区别是,LocationPair中提供的数据已经过进一步处理,因此目的地和距离已经放入他们的目标地图中。这意味着,此代码 >> Collectors.toMap(pair.target, pair.distance)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多