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)
但它不起作用,我的意思是语法不好。你能帮我解决这个问题吗?谢谢你。
您使用的不是lambda。Lambda 看起来像 (arguments) -> action. 您拥有的A::getName是method 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)
正在处理调用的A和max方法的流Stream<A>将导致Optional<A>not int。这是Optional因为有list_a可能是空的,这意味着不会有有效的结果。
如果你想获得OptionalInt你需要map Stream<A>到Stream<String>,然后map它Stream 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)
您可以使用 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)