繁体   English   中英

如何使用Java中的流来查找字符串列表中的最大长度?

[英]How to find max length in list of string using streams in Java?

我有一个类如下:

public class A
{
    String name;
    String getName(){return name;}
}

我也有一个如下列表:

List<A> list_a = new ArrayList<>();
//add n objects into list_a

现在我想在Java中使用流找到list_a中对象的最大长度。 我创建了如下代码:

final int max_len = list_a.stream().max(Comparator.comparingInt(A::getName::length));

但它不起作用,我的意思是语法不好。 你能帮帮我吗? 谢谢。

你使用的不是lambda Lambda看起来像(arguments) -> action 你在A::getName方法引用 ,但是additional ::length不是它的语法的一部分。

而不是A::getName::length您可以使用lambda,如a -> a.getName().length()

但是你的代码还有另外一个问题。

list_a.stream()
      .max(Comparator.comparingInt(A::getName::length));

正在处理在Stream<A>上调用的Amax方法的Stream<A>将导致Optional<A>而不是int 它是Optional因为list_a可能为空,这意味着没有有效的结果。

如果你想获得OptionalInt,你需要将Stream<A> mapStream<String> ,然后首先mapmapStream of int 然后你可以调用它的max()方法并得到:

OptionalInt maxOpt  = list_a.stream()
                            .map(A::getName)
                            .mapToInt(String::length)
                            .max();

当你已经有OptionalInt你可以使用它来检查是否有值isPresent()并通过getAsInt()获取它。 你也可以使用orElse(defaultValueIfEmpty)类的

int max = maxOpt.orElse(-1); //will return value held by maxOpt, or -1 if there is no value

您可以使用IntStream因为您只需查找最大长度:

OptionalInt oi = list_a.stream()
                 .map(A::getName)
                 .mapToInt(String::length)
                 .max()

final int max_len = oi.orElse(0); //defaulting to 0

如果需要使用自定义比较器,则需要lambda表达式:

final int max_len = list_a.stream()
                .max(Comparator.comparingInt(a -> 
                     a.getName().length())) //need a lambda
                .map(A::getName)
                .map(String::length)
                .orElse(0); //defaulting to 0

使用Collections.max替代解决方案:

A a = Collections.max(list_a, Comparator.comparing(obj -> obj.getName().length()));
int maxLen = a.getName().length();

请记住,如果集合为空, Collections.max会抛出NoSuchElementException 如果您不想要它,请使用@Pshemo的答案中的OptionalInt方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM