【问题标题】:Get the highest value, distinct elements from a list using Stream使用 Stream 从列表中获取最高价值的不同元素
【发布时间】:2020-08-30 17:03:14
【问题描述】:

我有一个 ArrayListBottle 对象。每个 Bottle 对象都有一个 brand:String 和一个 price:double 字段。我正在尝试使用 Stream API 编写一个表达式,所以我最终不仅得到了一个独特瓶子的列表,而且还有一个价格最高的独特瓶子的列表 - 例如。如果ArrayList 包含三个同名的Bottle 对象,我希望价格最高的那个进入最终列表。

【问题讨论】:

  • 还有什么问题?
  • 最后的列表只有唯一的 Bottle 对象,但是来自三个名为“BottleA”的 Bottle 对象,每个都有相应的价格 10、20 和 30,我希望价格为 30 的瓶子结束在最终名单中。不过,我整理的表达式并不能保证 - 所以它可能是价格为 10 或 20 的瓶子进入最终列表。
  • 添加一个比较器怎么样?
  • 显然,您不想要“独特的瓶子”,而是“具有独特名称(或品牌)的瓶子”。显示的表达式甚至没有远程连接到此任务。那么,为什么您要尝试更改完全不相关的代码,而不是直接解决实际任务呢?
  • 您的代码返回一个对象,而不是所有对象,从具有相同名称的瓶子中,即相等到processedGameRef,与unique相反。

标签: java-8 functional-programming java-stream


【解决方案1】:

您可以创建一个地图,以品牌名称为键,瓶子为值。然后使用合并功能,如果找到另一个同名的瓶子,它会保留价格最高的瓶子。然后,在最后获取地图值。在实践中看起来很热。

Collection<Bottle> highestPriceBottles = bottles.stream()
    .collect(Collectors.toMap(Bottle::getBrand, b -> b,
        BinaryOperator.maxBy(Comparator.comparingDouble(Bottle::getPrice))))
    .values();

【讨论】:

    【解决方案2】:

    这里有一个示例,说明如何找到价格最高的独特商品

    import org.junit.jupiter.api.Test;
    
    import java.util.List;
    import java.util.stream.Collectors;
    
    public class ArrayTest {
    
        public static class Bottle {
            private final String name;
            private final double price;
    
            public Bottle(final String name, final double price) {
                this.name = name;
                this.price = price;
            }
    
            public String getName() {
                return name;
            }
    
            public double getPrice() {
                return price;
            }
    
            @Override
            public String toString() {
                return "Bottle{" +
                    "name='" + name + '\'' +
                    ", price=" + price +
                    '}';
            }
        }
    
        @Test
        public void uniqueBottles() {
            List<Bottle> bottles = List.of(
                new Bottle("bottle1", 1.),
                new Bottle("bottle1", 2.),
                new Bottle("bottle1", 3.),
                new Bottle("bottle2", 3.5),
                new Bottle("bottle2", 1.5)
            );
    
            var processedBottleList = bottles
                .stream()
                .collect(Collectors.toMap(Bottle::getName, Bottle::getPrice, (p, p2) -> p > p2 ? p : p2))
                .entrySet()
                .stream()
                .map(e -> new Bottle(e.getKey(), e.getValue()))
                .collect(Collectors.toList());
    
            System.out.println(processedBottleList);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 2018-02-12
      • 1970-01-01
      • 2013-07-21
      • 2016-08-29
      • 1970-01-01
      • 2020-09-11
      相关资源
      最近更新 更多