Java8流-按对象的属性筛选

Java8流-按对象的属性筛选,java,java-stream,Java,Java Stream,我有一个名为Price的对象,它描述物品的买卖行为。在一些其他属性旁边,它主要如下所示: 公共类价格{ 私有价格类型; 私人整数金额; 私有项数据项数据; //... } 分别使用getter和setteramount是此商品应出售/购买的金额,ItemData描述了该商品的规格。PriceType是一个枚举,可以是PriceType.SELLING或PriceType.BUYING 我现在有了一种方法,这就是在列表中找到最匹配的价格。我所有的价格都存储在一个名为pricesList的列表中。

我有一个名为
Price
的对象,它描述物品的买卖行为。在一些其他属性旁边,它主要如下所示:

公共类价格{
私有价格类型;
私人整数金额;
私有项数据项数据;
//...
}
分别使用getter和setter
amount
是此商品应出售/购买的金额,ItemData描述了该商品的规格。PriceType是一个枚举,可以是
PriceType.SELLING
PriceType.BUYING

我现在有了一种方法,这就是在列表中找到最匹配的价格。我所有的价格都存储在一个名为
pricesList
的列表中。到目前为止,我的方法只是遍历列表,并返回与
PriceType
ItemData
匹配的第一个
Price

公共静态价格GetPriceByBiggestBaseAmount匹配GiveNamount(
ItemData收集的数据、价格类型、价格类型、整数金额){
退货价格表
.stream()
.过滤器(p->
p、 getItemData().equals(dataOfCollected)&&
p、 getType().equals(priceType))
.findFirst().orElse(null);
}
然而,这完全忽略了一个事实,即必须遵守的最低数量。因此,我需要的是,它不仅能为我找到第一个与
ItemData
PriceType
匹配的
Price
,而且还应该考虑到最小金额。它应该忽略每个金额小于给定金额的
Price
,并且在所有剩余金额中,它应该返回具有最大
Price.getAmount()
的一个。这可能有点难以理解,因此下面是一个示例:

假设我有三个Price对象,它们的PriceType和ItemData都相同,所以它们都是描述的,比如说
PriceType。购买
Price-我的程序将为给定数量的该项目支付的价格

price1.getAmount() == 1 //So this is describing the price for a single item.
price2.getAmount() == 6 //So this is describing the price for half a dozen of the item.
price3.getAmount() == 64 //Describing the price for an entire stack of the item.
如果我对某些
x
es执行
getPriceByBiggestBaseAmountMatchingGivenAmount(数据,类型,x)
操作,则应返回:

x: 1 => price1
x: 3 => price1
x: 7 => price2
x: 63 => price2
x: 64 => price3
x: 120 => price3
x: -1 => null
我不知道如何用流来实现这一点,当然我可以用for循环来实现,但这是我只能在万不得已的情况下才能做到的…

试着这样做: 首先过滤掉所有小于所需金额的价格,然后使用max()从列表中取出最大值

公共静态价格GetPriceByBiggestBaseAmount匹配GiveNamount(
ItemData收集的数据、价格类型、价格类型、整数金额){
退货价格表
.stream()
.过滤器(p->
p、 getItemData().equals(dataOfCollected)&&
p、 getType().equals(priceType)&&
p、 getAmount()请尝试以下方法:
首先过滤掉所有小于所需金额的价格,然后使用max()从列表中取出最大值

公共静态价格GetPriceByBiggestBaseAmount匹配GiveNamount(
ItemData收集的数据、价格类型、价格类型、整数金额){
退货价格表
.stream()
.过滤器(p->
p、 getItemData().equals(dataOfCollected)&&
p、 getType().equals(priceType)&&

p、 getAmount()好的,for循环仍然是一个好方法。使用流,您可能需要做两件事:1)过滤amount>=所需的amount(删除那些数量较低的)和2)按数量升序排序,然后进行第一次匹配为什么不在
中设置最小数量条件。filter()
本身,然后根据
.findFirst()之前的描述顺序对数据进行排序
?@BeshambherChaukhwan在
流中的中间操作不应该有任何副作用:我明白了……所以parallelStream是答案,以及我和Thomas所讨论的过滤器和排序方法??与Rahel回答的不安全流除外()?好的ol'for循环没有什么错,特别是如果您不了解StreamSweel,则使用for循环仍然是一件好事。使用流时,您可能需要做2件事:1)过滤量>=所需量(删除量较低的)2)按金额升序排序,然后进行第一次匹配为什么不在
.filter()
本身中设置最小金额条件,然后根据
.findFirst()之前的描述顺序对数据进行排序
?@BeshambherChaukhwan在
流中的中间操作不应该有任何副作用:我明白了……所以parallelStream是答案,以及我和Thomas所讨论的过滤器和排序方法??与Rahel回答的不安全流除外()?好的ol'for循环没有什么错,特别是如果你不了解Streams谢谢@fps,你是对的,这正是我想要的,非常感谢你的快速回复,我刚刚将>=切换为感谢@fps,你是对的,这正是我想要的,非常感谢你刚才切换的快速回复将>=转换为
public static Price getPriceByBiggestBaseAmountMatchingGivenAmount(
                    ItemData dataOfCollected, PriceType priceType, int amount) {
return pricesList
    .stream()
    .filter(p -> 
        p.getItemData().equals(dataOfCollected) &&
        p.getType().equals(priceType) &&
        p.getAmount() <= amount)  // remove bigger amounts
    .max(Comparator.comparing(Price::getAmount)) // take the biggest
    .orElse(null);
}