2016-11-17 4 views
0

アイテムオブジェクトの日付が現在の日付よりも大きい場合、それは未来のグループに分類され、日付が現在の日付よりも小さい場合、 pastdate
に落ちた後、私は集計数量を得ることができるように、これらのグループに減らすことになるでしょう、これらのグループの価格は、さらに集計値は、オブジェクトのoldPriceとoldQtyに座っSHOLD pastdateグループから返さJavaのストリーミングAPIで2つのグループを減らす

public class Item {   
      private String name; 
      private int qty; 
      private int oldQty; 
      private BigDecimal price; 
      private BigDecimal oldPrice; 
      Private Date date; 

      //constructors, getter/setters 
     } 


Map<String, List<Item>> groupByP = 
      items.stream().collect(Collectors.groupingBy((row)->{ 
//logic to seperate items into two group based on date 
})); 

この後に進む方法

+2

どうしてあなたは問題がありますか?あなたのアイテムを2つのグループに分けるロジック? –

答えて

0

アイテムをgrouに分割する場合psを使用するには、partitioningByコレクタを使用する必要があります。この場合

@AllArgsConstructor 
@Getter 
public static class Item { 
    private String name; 
    private int qty; 
    private int oldQty; 
    private BigDecimal price; 
    private BigDecimal oldPrice; 
    private Date date; 
} 

public static void main(String [] args) { 
    List<Item> items = Lists.newArrayList(); 
    Map<Boolean, List<Item>> partitionedItems = items.stream() 
      .collect(Collectors.partitioningBy(item -> item.getDate().after(new Date()))); 
} 

あなたは今

Map<Boolean, List<Item>> 

を得ることができますすることができます:

map.get(true) 

map.get(false) 

を返す条件に一致する項目のリストを返します。条件と一致しない項目のリストイオン

これらの2つのリストを持つことで、任意の削減を行うことができます。これには2つの方法があります

+1

'Lists.newArrayList()'と 'new ArrayList <>()'の比較は何ですか? – Holger

+1

@Holger私はこの習慣も持っています。このようなコードを書くようにしたのはグアバです。まったく何の意味もありません。 – Eugene

+2

@Eugene:これらのファクトリメソッドは、Java 7より前に作成されました。新しいものを使用するときはリストの要素型を繰り返す必要がありましたが、(ファクトリ)メソッドの呼び出しには使用しませんでした。 "ダイヤモンドオペレータ"の導入以来、それは時代遅れですが、互換性の理由から、Guavaは少なくともしばらくそれを保つでしょう。 – Holger

1

、最初は、最初のパーティションと、後で計算は次のとおりです。

Map<Boolean, List<Item>> partioned = items.stream() 
      .collect(Collectors.partitioningBy(item -> item.getDate().compareTo(now) > 0)); 

    partioned.get(Boolean.FALSE).stream() 
      .map(item -> new AbstractMap.SimpleEntry<>(item.getOldQty(), item.getOldPrice())) 
      .reduce((entry1, entry2) -> { 
       int sum = entry1.getKey() + entry2.getKey(); 
       BigDecimal averagePrice = entry1.getValue().add(entry2.getValue()).divide(BigDecimal.valueOf(2)); 
       return new AbstractMap.SimpleEntry<>(sum, averagePrice); 
      }).get(); 

(このパーティションが、その後、全ての量の合計と価格の平均値を保持しているペアを返します)私たちはカスタムコレクターを書いていますが、それはもっとはっきりしないでしょう。

関連する問題