1

私のcollect()関数は を呼び出しますFoo.f()Foo.f()自分の関数のパラメーターにしたいと思います。これはJavaで可能ですか?

  • Foo.f()または(またはa を返すFoo.g()他の関数) を関数に渡すにはどうすればよいですか?FooString
  • コレクションをたどり、すべてのコレクションアイテムのメソッドを呼び出した結果を収集する既存の関数はありますか?

.

class Foo {
    public String f() { return "f"; }
    public String g() { return "g"; }
    // ...
}

public List<String> collect(List<Foo> foos)
{
    List<String> result = new ArrayList<String>();

    for (final Foo foo: foos) {
        result.add(foo.f());  // I want Foo.f to be a parameter
    }

    return result;
}

アップデート

単に同じ関数を呼び出しているのではなく、コレクションfのすべてのアイテムのメンバー関数を呼び出しているという事実を指摘したいと思います。List<Foo>

4

4 に答える 4

8

Java 8では、次のことができます

collect(foos, Foo::f);

public List<String> collect(List<Foo> foos, Function<Foo,String> func)
{
    List<String> result = new ArrayList<String>();

    for (final Foo foo: foos) {
        result.add(func.apply(foo));
    }

    return result;
}

またはSteam APIを使用

Stream<Foo> foos = ...;
Stream<String> strs = foos.map(Foo::f);
于 2013-03-05T16:23:11.090 に答える
5

インターフェイスを使用できます

  interface Foo
  {
      String fn();
  }

インターフェイスをメソッドに渡します

 void anyMethod(Foo f)
 {
   f.fn();
 }

具体的なものを作成する必要はありません。匿名Fooで作成するだけですFoo

  new Foo() {

  @Override
  public String fn()
  {
   return "something";
  }
};

Java 8 では、インターフェースを匿名で実装する必要はありません。代わりにラムダ式を使用できます。

  anyMethod(()-> "something");
于 2013-03-05T16:22:02.400 に答える
0

Java では、メソッドをパラメーターとして渡すことは想定されていませんが、オブジェクトをパラメーターとして渡すことはできます。

これはStrategy Patternと呼ばれ、インターフェースを使用する必要があります。

于 2013-03-05T16:23:33.503 に答える
0

次のようなインターフェースを使用できます。

interface IFoo {
    String getString();
}

次に、カスタムの方法で実装します。

class F implements IFoo {
    public String getString() {
        return "f";
    }
}

class G implements IFoo {
    public String getString() {
        return "g";
    }
}

そして、関数に実装するもののリストを取得させますIFoo:

public List<String> collect(List<? extends IFoo> foos)
{
    List<String> result = new ArrayList<String>();

    for (final IFoo foo: foos) {
        result.add(foo.getString());
    }

    return result;
}

使用法:

for (String a : collect(Arrays.asList(new F(), new G()))) {
    System.out.println(a);
}
    //Prints f and g
于 2013-03-05T16:29:03.200 に答える