3

Groovy を使い始めたばかりで、Java 環境でクロージャを使用countできるようになったことは新鮮ですが、思い通りに作業するには問題があります。

Foo次のようなクラスがあるとします。

public class Foo {

    private boolean isBar;

    public boolean isBar() {
        return isBar;
    }

    public boolean setIsBar(boolean isBar) {
        this.isBar = isBar;
    }

}

Listここで、 ofインスタンスがあり、が trueであるオブジェクトFooの数を数えたいとしましょう。私はそれが次のようになることを期待していました:FooisBar

foos.count { it.isBar() }

または、プロパティ表記を使用すると、次のようになります。

foos.count { it.bar }

ただし、これは期待される結果を返さず、0 を返すだけです。

Listこれを単純なintでテストしてみました。2 の出現をカウントするには、次のようにします。

[1, 2, 2, 3].count(2)

しかし、クロージャーを使用して次のことができるはずではありませんか?

[1, 2, 2, 3].count { it == 2 }

後者も期待される結果を返していないようです。私が行った調査は、私のしていることは正しいことを示しているようですが、明らかにそうではありません。これを使用する正しい方法は何ですか?

4

3 に答える 3

4

Groovyによると、JDK Collection#count(Closure)は1.8.0まで追加されませんでした。#sum代わりに試すことができます:

assert [1, 2, 2, 3].sum() { it == 2? 1 : 0 } == 2
于 2012-08-13T21:28:56.150 に答える
2

Collection.count1.6未満のドキュメント:

Number count(Object value)

このコレクション内の指定された値の出現回数をカウントします

したがって:

> [1, 2, 2, 3].count(2)
2

Collection.count1.8未満のドキュメント:

Number count(Object value)

このコレクション内の指定された値の出現回数をカウントします。

Number count(Closure closure)

このコレクション内から指定されたクロージャを満たすオカレンスの数をカウントします。

ドキュメントは本当に、本当に役に立ちます。

于 2012-08-13T21:29:10.727 に答える
1

Groovy 1.8+ では、次のように記述できます。

[1, 2, 2, 3].iterator().count { it == 2 }

下位互換性のため、DefaultGroovyMethods の新しいメソッド シグネチャは次のとおりです。

public static Number count(Iterator self, Closure closure) {
于 2014-02-26T20:27:00.390 に答える