java - 收集具有最大长度的所有字符串的列表

标签 java java-8

我目前正在努力进行以下练习:

Given a Stream<String> collect (using Collector) a Collection of all Strings with maximum lenght.

这是我尝试过的:

private static class MaxStringLenghtCollector 
                    implements Collector<String, List<String>, List<String>> {

    @Override
    public Supplier<List<String>> supplier() {
        return LinkedList::new;
    }
    @Override
    public BiConsumer<List<String>, String> accumulator() {
        return (lst, str) -> {
            if(lst.isEmpty() || lst.get(0).length() == str.length())
                lst.add(str);
            else if(lst.get(0).length() < str.length()){
                lst.clear();
                lst.add(str);
            }                   
        };
    }

    @Override
    public BinaryOperator<List<String>> combiner() {
        return (lst1, lst2) -> {
            lst1.addAll(lst2);
            return lst1;
        };
    }

    @Override
    public Function<List<String>, List<String>> finisher() {
        return Function.identity();
    }

    @Override
    public Set<java.util.stream.Collector.Characteristics> characteristics() {
        return EnumSet.of(Characteristics.IDENTITY_FINISH);
    }
}

所以我写了我的自定义收集器来完成这项工作,但是......它看起来确实很丑。也许有一些标准方法可以做到这一点。例如,我会尝试分组收集器:

public static Collection<String> allLongest(Stream<String> str){
    Map<Integer, List<String>> groups = str.collect(Collectors.groupingBy(String::length));
    return groups.get(groups.keySet()
                    .stream()
                    .mapToInt(x -> x.intValue())
                    .max()
                    .getAsInt());
}

但这既丑陋又低效。首先,我们构建一个Map ,然后遍历它来构建 Set然后遍历它得到max-List .

最佳答案

我会这样做:

List<String> values = Arrays.asList("abc", "ab", "bc", "bcd", "a");
// I group by length and put it into a TreeMap then get the max value
values.stream().collect(groupingBy(String::length, TreeMap::new, toList()))
    .lastEntry()
    .getValue()
    .forEach(System.out::println);

输出:

abc
bcd

关于java - 收集具有最大长度的所有字符串的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37417358/

相关文章:

java - 基于响应中分数的 Elasticsearch 查询

java - Android/Java 中的两次减法

java - 如果管理层决定开源项目可以满足业务需求。您(Java开发人员)会学习PHP吗?

java - 任务“:workflows-java:NodeDriver. main()”执行失败

Java8 - 在 map 中搜索值

java - 为什么 DoubleBuffer.put() 分配内存,我应该如何避免这种情况发生?

java - 在java中解析QR返回的字符串

map 上的 Java 8 流式传输

java - Future.cancel() 后跟 Future.get() 杀死我的线程

java - 映射结构 : Mapping Collections objects based on it's type's properties