Как в потоке Java при выполнении метода .max () сделать приращение значения - PullRequest
5 голосов
/ 13 мая 2019

У меня есть объект, который имеет значение позиции в списке.И вам нужно определить значение следующей позиции, получив последнее значение и увеличив его на единицу.Если нет ни одного элемента, вернуть ноль.

public class App {
    public static void main(String[] args) {
        ArrayList<Entity> entities = new ArrayList<>();

        long nextPositionOrFirstIfNotExistWhenEmpty = getNextPositionOrFirstIfNotExist(entities);
        if (nextPositionOrFirstIfNotExistWhenEmpty != 0L) {
            throw new RuntimeException("Invalid");
        }

        entities.add(new Entity(2L));
        entities.add(new Entity(123L));
        entities.add(new Entity(3L));

        long nextPositionOrFirstIfNotExist = getNextPositionOrFirstIfNotExist(entities);
        if (nextPositionOrFirstIfNotExist != 124L) {
            throw new RuntimeException("Invalid");
        }
    }

    // how to refactoring this? not like "optionalLong.isPresent()"
    public static long getNextPositionOrFirstIfNotExist(List<Entity> entities) {
        OptionalLong optionalLong = entities.stream()
                .mapToLong(Entity::getPositionInList)
                .max();

        return optionalLong.isPresent() ? optionalLong.getAsLong() + 1 : 0L;
    }
}

class Entity {

    public Entity(Long positionInList) {
        this.positionInList = positionInList;
    }

    private Long positionInList;

    public Long getPositionInList() {
        return positionInList;
    }

    public void setPositionInList(Long positionInList) {
        this.positionInList = positionInList;
    }
}

Можно ли как-то внести изменения в одну строку, чтобы полученное максимальное значение сразу увеличилось на единицу, если есть, а если нет, товернуть ноль

То есть такой как (псевдокод):

long value = entities.stream()
                .mapToLong(Entity::getPositionInList)
                .max()
                .map(i -> i + 1)    // it's not work, just what i want
                .orElse(0L);

Ответы [ 2 ]

5 голосов
/ 13 мая 2019

Просто верните -1, если ничего не найдено, тогда ваше нормальное значение будет увеличено на 1, если оно присутствует, в противном случае оно будет равно 0, если ничего не найдено.

long value = entities.stream()
                     .mapToLong(Entity::getPositionInList)
                     .max()
                     .orElse(-1) + 1;
4 голосов
/ 13 мая 2019

вы могли бы map вместо mapToLong:

 entities.stream()
         .map(Entity::getPositionInList)
         .max(Comparator.naturalOrder())    
         .map(i -> i + 1)            
         .orElse(0L);
...