[英]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>
上调用的A
和max
方法的Stream<A>
将导致Optional<A>
而不是int
。 它是Optional
因为list_a
可能为空,这意味着没有有效的结果。
如果你想获得OptionalInt,你需要将Stream<A>
map
到Stream<String>
,然后首先map
它map
到Stream 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.