Javaの8:機能的な方法は、ソート書き、フィルタと同時にカウントします

Dipmcng:

私は、Javaにはかなり新しいです、と私は機能的な方法で、以下のロジックを記述しようとしています。

私は多くのフィールドを持つオブジェクトのリストを持っています。List<someObject>今の興味のある分野であるlong timestampString 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

m.antkowicz:

しかし、これは、それが最終であることを変数を必要とするため、ラムダで実行することが許容されません

まず第一に-これはあなたの変数を作ることができるので、問題ではありません効果的に、最終的な例を作成することもできます。単一のエントリアレイおよびラムダへの単一の(最初の)オブジェクトを渡し

二つ目は、何の意味が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();
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=229486&siteId=1