私は以下のようなクラスを持っています:
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));
しかし、それは動作しません、私はそれが構文で何か悪い意味します。あなたはこれで私を助けてもらえますか?ありがとうございました。
あなたが使用していることではありませんラムダ。ラムダは次のようになります(arguments) -> action
。何をしているのA::getName
であるメソッド参照が、追加は、::length
その構文の一部ではありません。
代わりにA::getName::length
、あなたは次のようにラムダを使用することができますa -> a.getName().length()
。
しかし、あなたのコードは、また別の問題があります。コード
list_a.stream()
.max(Comparator.comparingInt(A::getName::length));
ストリーム処理しているA
と、max
上と呼ばれる方法がStream<A>
になりますOptional<A>
ではありませんint
。それはOptional
チャンスがあるので、list_a
有効な結果がないことを意味して空にすることができますが。
あなたがOptionalIntを取得したい場合は、必要があるだろうmap
Stream<A>
にStream<String>
、その後、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