Можно ли из одного Stream достать сразу и min() и max()? (java)

247
06 апреля 2018, 19:42

Пусть есть IntStream, возможно ли получить из него допустим массив или лист, в котором будут 2 значения min и max стрима? Либо можно ли вообще каким-то образом вызвать терминальный метод на стрим больше 1 раза?

Answer 1
IntSummaryStatistics stats = IntStream.range(1, 100)
                                      .summaryStatistics();
int min = stats.getMin();
int max = stats.getMax();
Answer 2

Нет, стрим позволяет пройтись по нему только один раз (а если нижележащий сплитератор выстрелит, то можно и вообще не дойти до конца). Но это не значит, что вы не можете одновременно собирать и максимум, и минимум:

private static class Result {
    private Integer minimum;
    private Integer maximum;
    public Integer getMinimum() {
        return minimum;
    }
    public Integer getMaximum() {
        return maximum;
    }
    public synchronized Result update(int value) {
        if (minimum == null || minimum > value) {
            minimum = value;
        }
        if (maximum == null || maximum < value) {
            maximum = value;
        }
        return this;
    }
    public synchronized void combine(Result other) {
        if (other.getMinimum() != null) {
            update(other.getMinimum());
        }
        if (other.getMaximum() != null) {
            update(other.getMaximum());
        }
    }
    @Override
    public String toString() {
        return "Result {minimum=" + minimum + ", maximum=" + maximum + "}";
    }
}
public static Result compute(IntStream stream) {
    return stream.collect(Result::new, Result::update, Result::combine);
}
Answer 3

Конечно можно! Вот Ваш массив:

int[] miniMax = IntStream.range(1, 11).collect(() -> {
    return new int[] { Integer.MAX_VALUE, Integer.MIN_VALUE };
}, (t, value) -> {
    if (t[0] > value) t[0] = value;
    if (t[1] < value) t[1] = value;
}, (t, u) -> {
    if (t[0] > u[0]) t[0] = u[0];
    if (t[1] < u[1]) t[1] = u[1];
});
int min = miniMax[0];
int max = miniMax[1];

Если попадётся пустой stream, то получится невероятный результат min == 2147483647 и max == -2147483648

Условие что получено именно то, что надо: min <= max

READ ALSO
Java не видит переменные окружения

Java не видит переменные окружения

Есть проект с mavenВ нем есть такие строки:

228
String format EngishLocale

String format EngishLocale

Почему если в Stringformant() передать Locale

225
Надо ли удалять объект Runnable()?

Надо ли удалять объект Runnable()?

Есть метод с кодом

223
Spring-Integration and Threads. TaskExecutor

Spring-Integration and Threads. TaskExecutor

Заполняю очередь 10-ю сообщениями, начинаю их считывать 10-ю потокамиВ идеале эти 10 сообщений я и должен получить обратно, но вместо этого получаю...

295