如果在Array中具有null值,则无法检查ArrayList <object>的Element

时间:2016-09-21 09:50:31

标签: java android arraylist

我有ArrayList<Game>,我的对象游戏包含DateOpponentScore以及其他计算10个元素的字段。

有时Score可能是null 如何检查并将其更改为某个默认值?

我尝试了以下内容:

for(Game a : arrList)
{
  if(a.getScore() == null)
  {

  } 
} 

我需要做if(..) 10次,还是有另一种更快的方式?

4 个答案:

答案 0 :(得分:2)

在您的课程游戏中,您可以为分数设置默认值:

class Game{
     private Score score;
     public Score getScore(){     
         return this.score == null? this.score : new Score();      
     }
}

供您参考: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.5

  

每个类变量,实例变量或数组组件都是   在创建时使用默认值初始化(§15.9,§15.10.2):

     

对于type byte,默认值为零,即值   (字节)0

     

对于type short,默认值为零,即值   (短)0

     

对于int类型,默认值为零,即0。

     

对于long类型,默认值为零,即0L。

     

对于float类型,默认值为正零,即0.0f。

     

对于double类型,默认值为正零,即0.0d。

     

对于char类型,默认值为空字符,即   '\ u0000的'。

     

对于类型boolean,默认值为false。

     

对于所有引用类型(§4.3),默认值为null。

在您的课程游戏中,您可以为分数设置默认值:

修改

class Game{
     private Score score;
     public Score getScore(){     
         return this.score;      
     }
     public void setScore(Score score){     
         this.score = score;      
     }
     public Score getScoreOrDefault(Score default){
         if(Objects.isNull(this.score)){
              setScore(default);
              return default;
         }
     }
}

之后,您可以在传递新分数作为参数时调用getScoreOrDefault:

答案 1 :(得分:1)

我认为您正在以正确的方式进行,但如果您想要更高的性能,那么您可以在ternary operators内使用loop,如下所示

(a.getScore()==null)? a.setScore("value"):do nothing;

答案 2 :(得分:1)

您可以更新getScore()中的Game方法以返回Optional<Score>

public Optional<Score> getScore() {
    return Optional.ofNullable(score);
}

然后,当您调用它时,您可以将ifPresentConsumer

一起使用
  

如果存在值,则使用该值调用指定的使用者,   否则什么都不做。

game.getScore().ifPresent(score -> 
    System.out.println("This is only executed if the value is present!"));

示例

public class Game {

    private Score score;
    private String name;

    public Game(String name) { this.name = name;}

    public Game(String name, Integer scoreVal) {
        this.name = name;
        score = new Score(scoreVal);
    }

    public String getName() { return name; }

    public Optional<Score> getScore() {
        return Optional.ofNullable(score);
    }

    public static void main(String[] args) {
        List<Game> games = new ArrayList<Game>();
        games.add(new Game("Game 1"));
        games.add(new Game("Game 2", 10));

        for(Game game: games) {
            game.getScore().ifPresent(score -> 
                System.out.println("Score value in " + game.getName() + " is " + score.getValue()));
        } 
    }
}

class Score {
    private Integer value = 0;

    public Score(Integer val) { value = val; }

    public Integer getValue() { return value; }
}

输出

Score value in Game 2 is 10

答案 3 :(得分:0)

Using Java 8 Syntax
via this way you can check in list which fastest
arrList
.stream()
.filter(p-> p.getscore()==null)