Tengo una clase, como a continuación:
public class A
{
String name;
String getName(){return name;}
}
Y también tengo una lista, como a continuación:
List<A> list_a = new ArrayList<>();
//add n objects into list_a
En este momento me gustaría encontrar la longitud máxima de objeto que se encuentra en list_a utilizando corrientes en Java. He creado un código como a continuación:
final int max_len = list_a.stream().max(Comparator.comparingInt(A::getName::length));
Pero esto no funciona, quiero decir que es algo malo con la sintaxis. ¿Podrías ayudarme con esto? Gracias.
Lo que está utilizando no es lambda . Miradas lambda gusta (arguments) -> action
. Lo que tiene en A::getName
es la referencia del método , pero adicional ::length
no es parte de su sintaxis.
En lugar de A::getName::length
que puede utilizar como lambda a -> a.getName().length()
.
Sin embargo, el código tiene otro problema. Código
list_a.stream()
.max(Comparator.comparingInt(A::getName::length));
es la manipulación de las corrientes de A
y max
método llamado de Stream<A>
resultará en Optional<A>
no int
. Es Optional
porque hay una posibilidad de que list_a
pueden estar vacíos que significa que no habrá resultado válido.
Si desea obtener OptionalInt que se necesita para map
Stream<A>
que Stream<String>
y luego map
a Stream of int
s primero. A continuación, puede llamar a su max()
método y obtener:
OptionalInt maxOpt = list_a.stream()
.map(A::getName)
.mapToInt(String::length)
.max();
Cuando ya se tiene OptionalInt
se puede utilizar para comprobar si el valor existe isPresent()
y hacerlo a través de getAsInt()
. También se puede utilizar orElse(defaultValueIfEmpty)
como
int max = maxOpt.orElse(-1); //will return value held by maxOpt, or -1 if there is no value