【问题标题】:Rewrite SortedMap with streams Java用流 Java 重写 SortedMap
【发布时间】:2020-06-24 12:30:33
【问题描述】:

我有这个代码:

 SortedMap<String, Double> starsPerActivity = new TreeMap<>();
        for(Product p : products.values()) {
            for(Rating r : ratings) {
                if(r.getProductName() == p.getName()) {
                    starsPerActivity.put(p.getActivityName(), this.getStarsOfProduct(p.getName()));
                }
            }
        }
        return starsPerActivity;

我想用流重写这段代码。 我试过了,但我不知道怎么做。

方法 starsPerActivity() 返回一个映射,该映射将活动名称与属于该活动的产品的平均星级数相关联,活动名称按字母顺序排序。产品未评级的活动不应出现在结果中。

【问题讨论】:

    标签: java collections java-stream


    【解决方案1】:

    您可以使用third Collectors.toMap overload:

    public static <T, K, U, M extends Map<K, U>>
    Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                             Function<? super T, ? extends U> valueMapper,
                             BinaryOperator<U> mergeFunction,
                             Supplier<M> mapFactory)
    

    这使您可以定义要使用的地图实现:

    SortedMap<String, Double> starsPerActivity = products.values().stream()
         .filter(p -> ratings.stream()
             .anyMatch(r -> r.getProductName().equals(p.getName())))
         .collect(Collectors.toMap(
             Product::getActivityName, 
             p -> getStarsOfProduct(p.getName()), 
             Double::max, TreeMap::new
         ));
    

    我还注意到您在if 语句中使用了r.getProductName() == p.getName(),这可能适用于Strings。不鼓励这样做,请参阅:How do I compare strings in Java

    请注意,此实现选择具有最高值的评级。您可以通过将Double::max 替换为您喜欢的逻辑来更改此行为。如果您想要与当前相同的行为,那么您可以使用它,它足够接近:(a, b) -&gt; b,它只是选择最新的看跌值。

    【讨论】:

      【解决方案2】:
      SortedMap<String, Double> starsPerActivity = new TreeMap<>();
              products.values().forEach(p -> ratings.stream().filter(r -> r.getProductName().equals(p.getName()))
                      .forEachOrdered(r -> starsPerActivity.put(p.getActivityName(), this.getStarsOfProduct(p.getName()))));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 2011-11-17
        • 1970-01-01
        相关资源
        最近更新 更多