Как получить объект из-за максимального результата метода в Java 8 - PullRequest
0 голосов
/ 04 июня 2018

Я хочу переписать приведенный ниже оператор for-loop с помощью лямбда-выражения java8.

public class Test {

    List<ObjectTest> lst;

    public int operation(int a, int b) {
        return a * b;
    }

     int max = 0;
     ObjectTest suitableObj = null;
     for(ObjectTest obj:lst) {
        int result = operation(obj.getA(), obj.getB());
        if(result > max) {
            suitableObj = obj;
            max = result;
        }
     }
}

Как это возможно с помощью лямбда-выражения?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

@ Ответ Эрана является наиболее кратким, но вы должны написать перезагруженный метод:

public int operation(ObjectTest o) {
    return o.getA() * o.getB();
}   

Тогда вы можете просто написать:

import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.maxBy;

list.stream().max(comparing(Test::operation)).orElse(null);

, чтобы получить объект, для которогооперация дает максимальный результат, и

list.stream().maToInt(comparing(Test::operation)).max().orElse(0);

для получения максимального результата.

0 голосов
/ 04 июня 2018

Вы можете Stream свои ObjectTest элементы, сопоставить их с IntStream и вызвать метод max() для вычисления максимального значения:

int max = lst.stream()
             .mapToInt(obj->operation(obj.getA(), obj.getB()))
             .max()
             .orElse(0); // default value in case the input List is empty

РЕДАКТИРОВАТЬ: Если вы хотите после редактирования найти экземпляр ObjectTest, имеющий максимальное значение operation(obj.getA(), obj.getB()), вы можете использовать Stream 'max(Comparator<? super T> comparator):

ObjectTest max = lst.stream()
                    .max(Comparator.comparingInt(obj->operation(obj.getA(), obj.getB())))
                    .orElse(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...