Refactoring scoring algorithm
I would not refactor this substantially, except maybe to avoid the reuse of the matched1 and matched2 variables:

{
    boolean matched1 = false;
    boolean matched2 = false;
    for (...) {
        ...
    }
}

// and here again


Your intuition is correct that this could be done much cleaner using functional programming, but FP is a pain with Java 1–7. So we have the following options:


use Java 8
use functional language like Scala
ignore the pain, and do it anyway


The last solution does not involve java.util.concurrent.Callable, but an interface of our own:

interface TuningDataTest {
    boolean test(Product product, AlgoTuningData datum);
}


We can then write a function scoreTuningData:

private static class Score {
    final public int score1;
    final public int score2;

    public Score(int s1, int s2) {
        score1 = s1;
        score2 = s2;
    } 

    public Score add(Score that) {
        return new Score(this.score1 + that.score1, this.score2 + that.score2);
    }
}

private Score scoreTuningData(Product p1, Product p2, Iterable&lt;AlgoTuningData&gt; data, TuningDataTest test) {
    boolean matched1 = false;
    boolean matched2 = false;
    int score1 = 0;
    int score2 = 0;

    for (AlgoTuningData datum : data) {
        if (!matched1 &amp;&amp; test.test(p1, datum)) {
            matched1 = true;
            score1 += datum.getRank();
        }
        if (!matched2 &amp;&amp; test.test(p2, datum)) {
            matched2 = true;
            score2 += datum.getRank();
        }
        if (matched1 &amp;&amp; matched2) {
            break;
        }
    }

    return new Score(score1, score2);
}


Note that “data” is the plural form of “datum”, the word “datas” does not exist. One “datum” is a “record”, “data” are a set of records.

And your main code would then look like:

List&lt;AlgoTuningData&gt; topRatedData = ...;
List&lt;AlgoTuningData&gt; feedbackScoreData = ...;
Score score = scoreTuningData(p1, p2, topRatedData, new TuningDataTest() {
    @Override
    public boolean test(Product product, AlgoTuningData datum) {
        return product.getIsTopRated().equals(datum.getValue());
    }
}).add(scoreTuningData(p1, p2, feedbackScoreData, new TuningDataTest() {
    @Override
    public boolean test(Product product, AlgoTuningData datum) {
        return product.getPrice() &lt;= datum.getMaxProductPrice();
    }
}));

int score1 = score.score1;
int score2 = score.score2;