2016-11-17 42 views
0

我想根據日期將項目元素分組,如果項目對象的日期大於當前日期,那麼它將落入futuredate組中,並且如果日期小於當前日期,那麼它將陷入pastdate
,然後我想,以減少對這些組,這樣我就可以得到總數量,這些組的價格,從pastdate組返回進一步總值在oldPrice和oldQty shold坐對象的在java流媒體API中減少兩個組

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

那麼你到底有什麼麻煩?把你的物品分成兩組的邏輯? –

回答

0

如果您想要將項目拆分成組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) 

返回的項目清單不符合條件的項目列表離子

有了這兩個列表,你可以任意減少你想要的。

+1

與'new ArrayList <>()'相比,'Lists.newArrayList()'有什麼意義? – Holger

+1

@Holger我也有這種習慣,它是番石榴,使我們寫這樣的代碼。沒有任何意義。 – Eugene

+2

@Eugene:我想,這些工廠方法是在Java 7之前創建的,當我們在使用'new'時不得不重複列表的元素類型,而不是(工廠)方法調用時。自推出「鑽石操作工」以來,它已經過時,但由於兼容性的原因,番石榴至少會保留一段時間。 – 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(); 

第二個我們寫一個自定義收集器,但我懷疑它會更清楚。