当前位置: 首页 > 知识库问答 >
问题:

Java 8流-通过对象的属性过滤

经博延
2023-03-14

我有一个名为price的对象,它描述了一个项目的买卖行为。与其他一些属性相比,它主要如下所示:

public class Price {
    private PriceType type;
    private int amount;
    private ItemData itemData;
    
    //...
}

具有各自的吸气器和设置器。amount是该项目应出售/购买的金额,ItemData描述该项目的规格。PriceType是一个枚举,它是PriceType.sellingPriceType.buy

我现在有一个方法,是哪个工作,在一个列表中找到最匹配的价格。我的所有价格都存储在一个简单称为priceslist的列表中。到目前为止,我的方法只是遍历列表,并返回与PriceTypeItemData匹配的第一个Price:

public static Price getPriceByBiggestBaseAmountMatchingGivenAmount(
                        ItemData dataOfCollected, PriceType priceType, int amount) {
    return pricesList
        .stream()
        .filter(p -> 
            p.getItemData().equals(dataOfCollected) &&
            p.getType().equals(priceType))
        .findFirst().orElse(null);
}

然而,这完全忽视了一个事实,即必须尊重的数量是最低限度的。因此,我需要的是,它不仅为我找到第一个price,该itemdatapriceType以某种方式匹配的price,而且它还应该考虑最小数量。它应该忽略每一个小于给定金额的price,并且应该返回所有剩余金额中price.getAmount()最大的一个。这可能有点难以理解,所以下面是一个示例:

假设我有三个PriceType和ItemData相同的PriceType对象,所以它们都描述了一个PriceType.buyingPrice-因此我的程序将为给定数量的这个项目支付的价格。

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.

如果我为某些xES执行GetPriceByBigGestBaseAmountMatchingGivenAmount(数据,类型,x),则将返回:

x: 1 => price1
x: 3 => price1
x: 7 => price2
x: 63 => price2
x: 64 => price3
x: 120 => price3
x: -1 => null

我不知道如何用流来实现这一点,当然我可以用for循环来实现,但这是我只能做的最后一招...

共有1个答案

范弘亮
2023-03-14

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

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);
}
 类似资料:
  • 问题内容: 是否可以通过多个值过滤对象数组? 例如,在下面的示例中,我可以按term_ids 5和6进行过滤,然后同时键入car吗? 如果可以轻松使用,肯定可以使用库。 问题答案: 您可以使用Array.filter

  • 在 PowerShell 中,如何通过指定对象的名称(字符串)来获取对象的属性值?我想要类似这样的东西: 是否有类似于“获取属性名称”的内容?

  • 问题内容: 我有一个带有一系列对象属性的对象,这些对象属性具有以下相似的结构(这是从服务返回数据的方式): 当我执行ng-repeat时,我可以遍历所有这5个对象,例如: 但是, 我真正想要做的是仅对那些不是“ foo”类型的项进行迭代 ,即3次迭代而不是5次。我知道可以以某种方式利用过滤器来执行此操作,但是我不确定如何执行。我尝试了以下方法: 但这不起作用。实际上,即使执行以下操作以将对象限制为

  • 问题内容: 假设此JSON对象: 可以像这样检索“ set2”属性: 有没有一种方法可以通过索引检索“ set2”属性?它是JSON对象的第二个属性。这是行不通的(当然): 因此,假设我要检索JSON对象的第二个属性,但我不知道它的名称-那么我该怎么做? 更新: 是的,我知道对象是无序属性的集合。但是我不认为浏览器会干扰JSON文字/字符串定义的“原始”顺序。 问题答案: JavaScript中的

  • 问题内容: 如何通过匹配对象属性从数组中删除对象? 请只使用本机JavaScript。 我在使用接头时遇到麻烦,因为每次删除的长度都会减少。使用克隆并在原始索引上进行拼接仍然会给您带来长度减少的问题。 问题答案: 我以为你用过这样的东西? 修复bug所需要做的就是在下一次减少,然后(也可以选择向后循环): 为了避免线性时间删除,可以编写要 保留 在数组上的数组元素: 为了避免在现代运行时中进行线性

  • 免责声明:我已经发布过这样一个问题,它被标记为重复。请帮帮我。我已经看过了stackoverflow之前的所有方法,但都没有任何帮助。在我的例子中,提到的所有对Map(Key,Values)进行排序的方法都不起作用,因为我还有一个步骤,即检索值的属性。这一次,我试着详细讲述。 我有一个地图(字符串,对象)在Java,我想排序它使用对象的属性之一。 假设我有一堂课 现在,我创建了一张地图 我想通过类