【问题标题】:How use stream max for list of hashmap? ArrayList<HashMap<String, Object>>如何将流最大值用于哈希图列表? ArrayList<HashMap<String, Object>>
【发布时间】:2022-11-03 22:12:48
【问题描述】:

我有一个 Hashmap 的 ArrayList 和 hashmap 看起来像 {"Start":"A", "End":"B","Length":5},我想找到一个长度最长的,或者可能不止一个,它们的长度都等于 max长度

尝试使用流,我应该怎么做?

ArrayList<HashMap<String, Object>> resultslist = new ArrayList<HashMap<String, Object>>();
ArrayList<HashMap<String, Object>> finalresult = resultslist.stream().max()

JAVA新手,请帮忙。

【问题讨论】:

  • Stream#max 接受 Comparator 对象。你可以传递类似Comparator.comparingInt(Map::length) 的东西。如果您是编程新手(而不仅仅是 Java),我建议您尝试使用 for 循环,而不是现在使用流。
  • 您可以通过更好的性能实现流与 for 循环所做的一切,所以从它开始。此外,从 for 循环开始学习然后进入流更容易

标签: java java-stream max


【解决方案1】:

一口气,您可以像这样使用Collectors.groupingBy

List<HashMap<String, Object>> response = resultslist.stream()
        .collect(Collectors.groupingBy(HashMap::size))
        .entrySet().stream()
        .max(Map.Entry.comparingByKey())
        .map(Map.Entry::getValue)
        .orElseGet(Collections::emptyList);

这个想法是,按大小分组(这一步返回一个整数映射和映射列表),然后得到这个映射的最大值。

【讨论】:

    【解决方案2】:

    使用物体的力量

    hashmap 看起来像 {"Start":"A", "End":"B","Length":5}

    你在滥用地图,它绝对应该是一个习惯目的, 属性具有正确的类型,而不是将它们存储为 java.lang.Object 在地图中。

    例如,如果我们实现为Java 16 record,它可能会如何循环:

    public record Foo(String start, String end,int length) {}
    

    现在事情会很简单,而不是嵌套集合,您将拥有Foo 的列表。

    这就是如何找到最大lengthFoo

    List<Foo> foos = // intializing the list
    
    // with Stream API
    Foo max = foos.stream()
        .max(Comparator.comparingInt(Foo::lengt))
        .orElseThrow();
    
    // using Collections.max()
    Foo max = Collections.max(foos, Comparator.comparingInt(Foo::lengt));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 2013-05-23
      • 2012-02-02
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多