2017-10-02 9 views
6

は私がJava 8ストリーム - 結果でグループ内の値を操作するにはどうすればよいですか?

Name1, Active 
Name2, InActive 
Name3, InActive 
Name4, Active 

のような2つのStringフィールドを持つオブジェクトのリストを持っていると私は=アクティブ真と偽=インアクティブ

Map<Boolean, List<String>> 

どこを持っていると思います。

私は

active = dualFields.stream().collect(
     Collectors.groupingBy( 
      x -> StringUtils.equals(x.getPropertyValue(), "Active"))); 

を試してみました。しかし、あなたのList<String>propertyValueで構成したい場合は、私はよりも、

Map<Boolean, List<DualField>> 

答えて

7

まず、あなたが使用することができますpartitioningBy、これは特殊なケースのgroupingByです(ここではgroupin gをPredicateで2つのグループに分ける)。 mappingでオブジェクトを必要な文字列にマップできます。

私はあなたがList<String>が第二の特性(「アクティブ」または「非アクティブ」が含ますなわちないgetPropertyValue()、)の値を含むようにしたいと仮定しています:

Map<Boolean,List<String>> map = 
    dualFields.stream() 
       .collect(Collectors.partitioningBy(x -> StringUtils.equals(x.getPropertyValue(), "Active"), 
               Collectors.mapping(DualField::getSecondPropertyValue, 
                    Collectors.toList())); 
+0

コードは '置換することにより、より読みやすくなり、 x.getPropertyValue()。equals( "Active") 'で処理するか、nullを処理する場合は' 'Active '.equals(x.getPropertyValue()、" Active " ()) '...' null 'を扱う標準APIメソッド 'Objects.equals'もあります。どちらの場合でも、サードパーティのライブラリが' StringUtils.equals'のような冗長メソッドを提供する必要はありません... – Holger

2

を受け取っ:すべての

active = dualFields.stream().collect(
     Collectors.groupingBy( 
      x -> StringUtils.equals(x.getPropertyValue(), "Active"), 
      Collectors.mapping(DualField::getPropertyValue, Collectors.toList()); 
      )); 
関連する問題