異なる引数または異なる引数の数と消費者を組み合わせます

アレクセイBalenko:

レッツ言うには、私たちの方法は、受信入力文字列を返すいくつかのリスト出力をこの出力は、入力およびそれらのいくつかではないに依存し、その一部の発電機のいくつかの数の結果である-彼らは定義済みの値を追加します。私は1人の消費者にそれらを組み合わせて、ちょうど入力文字列に適用し、その後、いくつかの機能インタフェース(例えば消費者)のリストのように、これらの発電機を実装したいです。

だから、私は簡単で、独立して小型発電機を変更することができます。しかし、問題はないすべての私の発電機が必要だということです入力他の人と、このような消費者を結合する能力を持っている-パラメータとして文字列を、私はただ一つだけの理由のためにそこにこのパラメータを渡します。

public class ConsumersTest {

private static <T, U> BiConsumer<T, U> combine(List<BiConsumer<T, U>> consumers) {
    return consumers.stream().reduce((arg1, arg2) -> {}, BiConsumer::andThen);
}

List<String> generate(String input) {
    ArrayList<String> output = new ArrayList<>();
    combine(getGenerators()).accept(input, output);
    return output;
}

private List<BiConsumer<String, List<String>>> getGenerators() {
    return Arrays.asList(
            this::addFirstDependent,
            this::addSecondIndependent
    );
}

private void addFirstDependent(String input, List<String> output) {
    if (input.contains("some string")) {
        output.add("First-Dependent");
    }
}

private void addSecondIndependent(String input, List<String> output) {
    output.add("Predefined Output");
}}

それは1つの傘の下に別の消費者を組み合わせて、一つの場所にそれらを適用することは可能ですか?それともこれは悪いアイデアではなく、そのような事を行うには正しい方法は何ですか?

ホルガー:

モジュール式のソフトウェアとで共通のインターフェース持っている珍しいパターンではないアダプタを、特定の実装が合うようにします。例えば

public class ConsumersTest {

    List<String> generate(String input) {
        ArrayList<String> output = new ArrayList<>();
        generators.accept(input, output);
        return output;
    }

    private static <T, U> BiConsumer<T, U> ignoreFirstArg(Consumer<U> consumer) {
        return (t, u) -> consumer.accept(u);
    }

    private final BiConsumer<String, List<String>> generators =
        Stream.<BiConsumer<String, List<String>>>of(
                this::addFirstDependent,
                ignoreFirstArg(this::addSecondIndependent)
        ).reduce(BiConsumer::andThen).orElse((arg1, arg2) -> {});

    private void addFirstDependent(String input, List<String> output) {
        if (input.contains("some string")) {
            output.add("First-Dependent");
        }
    }

    private void addSecondIndependent(List<String> output) {
        output.add("Predefined Output");
    }
}

だから、ignoreFirstArgその最初のパラメータを持っていない方法のための一般的なアダプタがあります。アダプターの方法の任意の数に制限はありません。しかし、アダプタは非常に具体的なので、ある場合には、一度だけ使用することをノートでは、それは右の組み合わせのコードで、メソッド参照の代わりにラムダ式を書くことも可能です。私は繰り返し、すべての評価を取得しないために、そのコードを変更することに注意してくださいgenerate(String input)そうしないと、あなたは複合機能を再利用していないときにそれらを組み合わせることでも意味がないのと同じように、あなたが使用も可能性として、コール

List<String> generate(String input) {
    ArrayList<String> output = new ArrayList<>();
    Stream.<BiConsumer<String, List<String>>>of(
            this::addFirstDependent,
            ignoreFirstArg(this::addSecondIndependent)
    ).forEach(g -> g.accept(input, output));
    return output;
}

あるいは単純

List<String> generate(String input) {
    ArrayList<String> output = new ArrayList<>();

    this.addFirstDependent(input, output);
    this.addSecondIndependent(output);

    return output;
}

これはまだ、すべての発電機は、単一のラインで構成されるように、機能コードよりも維持することが悪くありません。

おすすめ

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