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

Daw*_*ski 4 java lambda functional-programming list java-stream

我有一个像下面这样的课程:

public class A
{
    String name;
    String getName(){return name;}
}
Run Code Online (Sandbox Code Playgroud)

我还有一个如下列表:

List<A> list_a = new ArrayList<>();
//add n objects into list_a
Run Code Online (Sandbox Code Playgroud)

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

final int max_len = list_a.stream().max(Comparator.comparingInt(A::getName::length));
Run Code Online (Sandbox Code Playgroud)

但它不起作用,我的意思是语法不好。你能帮我解决这个问题吗?谢谢你。

Psh*_*emo 6

您使用的不是lambda。Lambda 看起来像 (arguments) -> action. 您拥有的A::getNamemethod reference,但 additional::length不是其语法的一部分。

而不是A::getName::length您可以使用 lambda 之类的a -> a.getName().length()

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

list_a.stream()
      .max(Comparator.comparingInt(A::getName::length));
Run Code Online (Sandbox Code Playgroud)

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

如果你想获得OptionalInt你需要map Stream<A>Stream<String>,然后mapStream of int的第一s-。然后你可以调用它的max()方法并得到:

OptionalInt maxOpt  = list_a.stream()
                            .map(A::getName)
                            .mapToInt(String::length)
                            .max();
Run Code Online (Sandbox Code Playgroud)

当您已经拥有时,OptionalInt您可以使用它来检查那里是否有价值isPresent()并通过getAsInt(). 你也可以使用orElse(defaultValueIfEmpty)

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


ern*_*t_k 5

您可以使用 an ,IntStream因为您只是在寻找最大长度:

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

final int max_len = oi.orElse(0); //defaulting to 0
Run Code Online (Sandbox Code Playgroud)

如果您需要使用自定义比较器,您将需要一个 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
Run Code Online (Sandbox Code Playgroud)