私は、Javaにはかなり新しいです、と私は機能的な方法で、以下のロジックを記述しようとしています。
私は多くのフィールドを持つオブジェクトのリストを持っています。List<someObject>
今の興味のある分野であるlong timestamp
とString bookType
問題文はある-私は、同じ持っている与えられたリスト内のオブジェクトの数のカウント知りたいbookType
最低のタイムスタンプを持つものとしての。
例えば、我々場合、ソートに基づいてオブジェクトの指定されたリストtimestamp
を昇順に、そしてソートされたリストの最初のオブジェクトが持つbookType
フィールドを通りSOMETYPE
、その後、私は、リストにあるどのように多くのオブジェクトを知りたいですbookType
SOMETYPE
私は2つの一時変数をmaintaingしてから最低見つけるために、一度リストを繰り返し処理することにより、昔ながらの非機能的な方法を使用して、このロジックを書かれているtimestamp
と、対応するbookType
各カウントAMDbookType
しかし、これはそれがために、変数を必要とするため、ラムダで実行することが許容されません final
私は私がに基づいて、指定されたリストをソート可能性の部分を書くことができます timestamp
n.stream().sorted(Comparator.comparingLong(someObject::timestamp)).collect(Collectors.toList());
私は最低の数を見つけることを続行する方法をスタックしています timestamp
bookType
しかし、これは、それが最終であることを変数を必要とするため、ラムダで実行することが許容されません
まず第一に-これはあなたの変数を作ることができるので、問題ではありません効果的に、最終的な例を作成することもできます。単一のエントリアレイおよびラムダへの単一の(最初の)オブジェクトを渡し
二つ目は、何の意味が1つのラムダですべてを置くために基本的にありませんということです-どのように論理的に見つけること、このことについて考えてmin
いくつかの属性によってカウントが接続されている値をグループ化したオブジェクト?されていません -ちょうどあなたのコードを難読化します一つのストリームに(何らかの形で)これを置きます
あなたは何をすべき-あなたは見つけるために方法を準備しなければならないmin
価値を、あなたを返すことがありますbookType
、その後によるストリームの収集及びグループそれbookType
特定のキー値を持つコレクションの、リターンサイズ
これは、このスクラッチ上のようになります。
public class Item {
private final long timestamp;
private final String bookType;
// Constructors, getters etc
}
// ...
public int getSizeOfBookTypeByMinTimestamp() {
return items.stream()
.collect(Collectors.groupingBy(Item::getBookType))
.get(getMin(items))
.size();
}
private String getMin(List<Item> items) {
return items
.stream()
.min(Comparator.comparingLong(Item::getTimestamp))
.orElse( /* HANDLE NO OBJECT */ ) // you can use also orElseThrow etc
.getBookType();
}