执行.max()方法时在Java流中如何增加值

Fre*_*Goo 5 java java-8 java-stream

我有一个在列表中具有位置值的实体。然后,您需要通过获取最后一个值并增加一个来确定下一个头寸的值。如果没有一个元素,则返回零。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以以某种方式在单行中进行更改,以便对于获得的最大值,如果存在则立即增加一,如果不存在则立即增加零

也就是说,例如这样(伪代码):

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

Lin*_*ica 5

-1如果什么也没找到就返回,那么如果您的正常值存在,则将其增加;1否则,0如果没有任何结果,则将导致其正常值。

long value = entities.stream()
                     .mapToLong(Entity::getPositionInList)
                     .max()
                     .orElse(-1) + 1;
Run Code Online (Sandbox Code Playgroud)

  • @Eugene实际上是一种常见模式,例如,与`string.substring(string.indexOf(ch)+1)比较 (3认同)