2016-11-17 43 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(); 

第二个我们写一个自定义收集器,但我怀疑它会更清楚。