2016-10-24 15 views
4

私はjava-8で作業しています。次のコードスニペットを参照してください -ラムダ式の使用中に変数に値を格納する

studentsOfThisDept = students.stream() 
       .filter(s -> (student != null 
         && s.getDepartment() != null 
         && s.getDepartment().getCode().equals("CS") 
         )) 
       .collect(Collectors.toList()); 

ここで私は2チェックを実行する必要があります -

s.getDepartment() != null ; // 1st check 

s.getDepartment().getCode().equals("CS") // 2nd check 

を私はs.getDepartment()の値を格納することができますどのような方法がありますいくつかの変数(例えば、dept)は、2番目のチェックで書くことができるように -

dept.getCode().equals("CS"); 
人の

答えて

10

フィルタリング後の変数を導入し、ヌル学生

studentsOfThisDept = students.stream() 
      .filter(s -> s != null) 
      .filter(s -> { 
        Dept dept = s.getDepartment(); 
        return dept != null && dept.getCode().equals("CS"); 
        }) 
      .collect(Collectors.toList()); 

filter()ただの終わりにブール値を返すことを確認してくださいなどのものを記録し、ラムダブロックは変数を宣言するようなことを行うことができることを意味述語を、とりブロック。述語は、オブジェクトをとりブール値を返す関数です。

+0

ある述語から 'boolean'を返すことが必須ですか? – Razib

+3

@Razibはい。なぜなら、述語は、署名が 'boolean test(T t)'である抽象メソッドを持つ関数インタフェースですから。これはラムダとして実装しているメソッドです。ですから、このインターフェースを満足させるためには、ブール値を返す必要があります。 https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.htmlを参照してください。 – kjsebastian

2
studentsOfThisDept = students.stream() 
      .filter(s -> { 
        if (s == null) return false; 
        Department dep = s.getDepartment(); 
        return (dep != null && dep.getCode().equals("CS") 
        );}) 
      .collect(Collectors.toList()); 
5

代替は

studentsOfThisDept = students.stream() 
    .filter(Objects::nonNull) 
    .filter(s -> Optional.ofNullable(s.getDepartment()) 
         .map(Department::getCode).filter(c -> c.equals("CS")).isPresent() 
      ) 
    .collect(Collectors.toList()); 
関連する問題