我需要比较并保留Java流中的多个值

我需要比较并保留Java流中的多个值,java,Java,我正在使用流重写一个方法,但我有点卡住了。对于短篇小说来说,它是一种用于检索玩家可用技能的方法。整个技能列表存储在玩家模板中(getTemplate(),列表可通过getTemplate()访问。getSkills())。玩家还拥有自己的已知技能,存储在地图中(在本例中,我只使用getSkillLevel,如果已知,它只返回技能级别,如果未知,则返回-1) 它必须通过某些条件进行过滤,例如: 模板技能必须是玩家可以“学习”的,根据当前玩家等级(过滤内容) 如果玩家还不知道该技能(getSkil

我正在使用流重写一个方法,但我有点卡住了。对于短篇小说来说,它是一种用于检索玩家可用技能的方法。整个技能列表存储在玩家模板中(getTemplate(),列表可通过getTemplate()访问。getSkills())。玩家还拥有自己的已知技能,存储在地图中(在本例中,我只使用getSkillLevel,如果已知,它只返回技能级别,如果未知,则返回-1)

它必须通过某些条件进行过滤,例如:

  • 模板技能必须是玩家可以“学习”的,根据当前玩家等级(过滤内容)
  • 如果玩家还不知道该技能(getSkillLevel的结果==-1),或者如果当前玩家的技能水平低于模板技能,则会在列表中添加模板技能
GeneralSkillNode是包含以下信息的容器:

  • 技能id(名为getId())
  • 技能级别(命名为getValue())
  • 学习它的最低级别(名为getMinLvl())
getTemplate().getSkills()是该玩家可以学习的全部技能(此处列出了每个技能条目,无论级别如何),这是一个列表

问题是,它目前注册的所有技能级别范围。假设一个给定的技能id有18个级别(1-1-5,1-2-5,1-3-5,…1-18-80),它将为技能id 1添加18个GeneralSkillNode我需要按技能id进行筛选,并仅保留每个技能id的最大可能级别(如果您按照我的解释,使用getValue(),则可以测试该级别)。如果我使用带有.max()的比较器,它将仅检索单个技能的最大级别

我正在寻找最优雅的方式来做这件事。提前感谢您的帮助

以下是我目前的结果:

/**
 * @return a {@link Collection} of all available {@link GeneralSkillNode}s (being general or autoGet) <b>of maximal level</b> for this {@link Player}.
 */
public Collection<GeneralSkillNode> getAllAvailableSkills()
{
    final List<GeneralSkillNode> result = new ArrayList<>();

    getTemplate().getSkills().stream().filter(s -> s.getMinLvl() <= getLevel()).forEach(s ->
    {
        final int playerSkillLevel = getSkillLevel(s.getId());
        if (playerSkillLevel == -1 || playerSkillLevel < s.getValue())
            result.add(s);
    });
    return result;
}
/**
*@return此{@link Player}的最大级别的所有可用{@link GeneralSkillNode}的{@link Collection}(通用或自动获取)。
*/
公共集合getAllAvailableSkills()
{
最终列表结果=新建ArrayList();
getTemplate().getSkills().stream().filter(s->s.getMinLvl())
{
final int playerSkillLevel=getSkillLevel(s.getId());
如果(playerSkillLevel==-1 | | playerSkillLevel
编辑:感谢您的帮助,最终版本现在看起来是这样的:

    /**
 * @return a {@link Collection} of all available {@link GeneralSkillNode}s (being general or autoGet) <b>of maximal level</b> for this {@link Player}.
 */
public Collection<GeneralSkillNode> getAllAvailableSkills()
{
    final List<GeneralSkillNode> result = new ArrayList<>();

    getTemplate().getSkills().stream().filter(s -> s.getMinLvl() <= getLevel()).collect(Collectors.groupingBy(s -> s.getId(), Collectors.maxBy(Comparator.comparing(s -> s.getValue())))).forEach((i, s) ->
    {
        final int playerSkillLevel = getSkillLevel(i);
        if (playerSkillLevel == -1 || playerSkillLevel < s.get().getValue())
            result.add(s.get());
    });
    return result;
}
/**
*@return此{@link Player}的最大级别的所有可用{@link GeneralSkillNode}的{@link Collection}(通用或自动获取)。
*/
公共集合getAllAvailableSkills()
{
最终列表结果=新建ArrayList();
getTemplate().getSkills().stream().filter(s->s.getMinLvl()s.getId(),Collectors.maxBy(Comparator.comparing(s->s.getValue())))).forEach((i,s)->
{
最终整数playerSkillLevel=getSkillLevel(i);
如果(playerSkillLevel==-1 | | playerSkillLevel
要获得每项技能的最高级别,您可以执行
分组操作
来分离每项技能,然后执行
最大级别操作
,以获得每项技能的最高级别

getTemplate().getSkills().stream().filter(s -> s.getMinLvl() <= getLevel())
                         .collect(Collectors.groupingBy(s -> s.getId(), 
                                  Collectors.maxBy(Comparator.comparing(s -> s.getValue()))));
getTemplate(),
Collectors.maxBy(Comparator.comparing(s->s.getValue());

您能操作GeneralSkillNode的值吗?比如“更新”技能水平?或者您可以重写GeneralSkillNode.equals()和GeneralSkillNode.hashCode()方法吗?这些节点是从XML数据生成的,不愿意动态编辑(在服务器启动时加载一次,然后再也不处理)。如果需要的话,我可以重写GeneralEquals/hashCode,是的。我将对其进行测试,并很快进行检查,谢谢你的关注!:)