首页 >Java >java教程 >如何从 Java 流中获取所有最大值?

如何从 Java 流中获取所有最大值?

Linda Hamilton
Linda Hamilton原创
2024-12-08 13:33:11596浏览

How to Get All Maximum Values from a Java Stream?

如何在 Java Stream 中返回多个最大值

在 Java Stream API 中,max 函数通常返回以下值中的最大元素之一提供比较器时的集合。但是,如果我们想要所有最大值,特别是当多个元素具有相同的最大值时,该怎么办?

返回所有最大值的技巧

不幸的是,Java API 不这样做不提供检索所有最大值的直接方法。但是,解决方法是使用收集器存储部分结果。这是一个基于比较器生成收集器的辅助函数:

static <T> Collector<T, ?, List<T>> maxList(Comparator<? super T> comp) {
    return Collector.of(
        ArrayList::new,
        (list, t) -> {
            int c;
            if (list.isEmpty() || (c = comp.compare(t, list.get(0))) == 0) {
                list.add(t);
            } else if (c > 0) {
                list.clear();
                list.add(t);
            }
        },
        (list1, list2) -> {
            if (list1.isEmpty()) {
                return list2;
            } 
            if (list2.isEmpty()) {
                return list1;
            }
            int r = comp.compare(list1.get(0), list2.get(0));
            if (r < 0) {
                return list2;
            } else if (r > 0) {
                return list1;
            } else {
                list1.addAll(list2);
                return list1;
            }
        });
}

此收集器维护一个与比较器等效的元素列表。合并结果时,收集器返回包含较大元素的列表。如果元素相等,则会附加列表。

要在流上使用此收集器,只需按如下方式应用它:

Stream<String> input = ... ;

List<String> result = input.collect(maxList(comparing(String::length)));

示例用法

例如,让我们查找 a 中具有最大长度的所有字符串列表。

List<String> strings = Arrays.asList("apple", "banana", "pear", "orange", "grapes", "kiwi");

Stream<String> stringStream = strings.stream();

List<String> maxStrings = stringStream.collect(maxList(Comparator.comparingInt(String::length)));

System.out.println(maxStrings); // [apple, banana, grapes, orange]

在此示例中,maxList 收集器将返回一个包含所有具有最大长度的字符串的列表。

以上是如何从 Java 流中获取所有最大值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn