この方法で異なるゲッターを使用します

sjne:

以下の方法を考えます

public int calcSum(List<MyClass> items) {
    return items.stream()
                .mapToInt(i -> i.getHeight())
                .sum();
}

私は同じreturn文を繰り返す必要がないように、私はメソッドの引数に渡すことができるという別のゲッターを使用するための私のオプション何getWeight()例えば?

私は多分(それが可能の場合)ゲッターを返す別の方法を使用して考えていたが、私はそのための良い実装のトラブル考え方を持っています。助けてくれてありがとう!

アンディ・ターナー:

渡しToIntFunction<T>パラメータとして:

public <T> int calcSum(List<T> items, ToIntFunction<? super T> fn) {
    return items.stream()
                .mapToInt(fn)
                .sum();
}

// Example invocations:
int heightSum = calcSum(items, MyClass::getHeight);
int weightSum = calcSum(items, MyClass::getWeight);

<? super T>AAである有界ワイルドカード(具体的には低有界ワイルドカード)。それはちょうど少しをより柔軟ビットAPIになります。例えば、ワイルドカードのため、あなたが呼び出すことができます。

ToIntFunction<Object> constantValue = a -> 1;
int count = calcSum(items, constantValue);

のでconstantValueいずれかを受け入れObject、それはまた、受け入れることができMyClassインスタンスを。

拘束がなければ、あなたはに合格することはできませんToIntFunction<Object>あなたが別のインスタンスを持っている必要があるだろう、別のリストの要素タイプのために:

ToIntFunction<MyClass> constantValueForMyClass = a -> 1;
ToIntFunction<MyOtherClass> constantValueForMyOtherClass = a -> 1;
ToIntFunction<YetAnotherClass> constantValueForYetAnotherClass = a -> 1;
// ...

これだけの退屈で反復的です。

おすすめ

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