Извлечение нескольких значений из одного потока Java - PullRequest
2 голосов
/ 15 октября 2019

Мне нужно извлечь два значения (min & max) из List моих пользовательских объектов, и в настоящее время я создаю потоки дважды и извлекаю их отдельно. Я думаю, что это может быть оптимизация, чтобы использовать один поток и использовать карту или аналогичную функцию, чтобы получить минимальное и максимальное значения в одном потокеЭто возможно?

public class MyClass {

    public static class MyC {
        double val;
        public MyC(double val) {
            this.val = val;
        }

        public double getVal() {return val;}
    }

    public static void main(String[] args) {


        List<MyC> list = new ArrayList<>();
        list.add(new MyC(10.0d));
        list.add(new MyC(20.0d));

        double min = Optional.ofNullable(list).stream()
                        .flatMap(List::stream)
                        .limit(13)
                        .map(MyC::getVal)
                        .min(Double::compare)
                        .orElse(getMinDefault());

        double max = Optional.ofNullable(list).stream()
                .flatMap(List::stream)
                .limit(13)
                .map(MyC::getVal)
                .max(Double::compare)
                .orElse(getMaxDefault());

    }

    private static double getMinDefault() {
        return 1.0d;
    }

    private static double getMaxDefault() {
        return 20.0d;
    }
}

1 Ответ

3 голосов
/ 15 октября 2019

Вы можете использовать DoubleSummaryStatistics для max и min вашего атрибута значения.

DoubleSummaryStatistics summaryStatistics = list // avoid initialising list as 'null'
        .stream()
        .limit(13)
        .mapToDouble(MyC::getVal)
        .summaryStatistics();
double max = summaryStatistics.getMax();
double min = summaryStatistics.getMin();

Что касается пользовательских значений по умолчанию, к которым вы обращаетесь, выможет использовать условную логику, такую ​​как:

double max = getMaxDefault();
double min = getMinDefault();
if (!list.isEmpty()) {
    DoubleSummaryStatistics summaryStatistics = list
            .stream()
            .limit(13)
            .mapToDouble(MyC::getVal)
            .summaryStatistics();

    max = summaryStatistics.getMax();
    min = summaryStatistics.getMin();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...