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

Java流:对象属性更新困难

扶文光
2023-03-14

我有一个包含很多字段的列表,需要使用stream在一次传递中创建一个列表。

>

  • 我们需要将列表中的字段current标记为true,以获得输入列表中最小的正整数

    输入:

    [PT(pn=-1, endDate=2019-01-11, dp=MAR 2019,..),           
    PT(pn=4, endDate=null, dp=APR 2019,..),        
    PT(pn=6, endDate=2019-05-11, dp=MAY 2019,..)]       
    

    输出:

    [OP(pn=11, current=false, dp=MAR 2019),
     OP(pn=4, current=true, dp=APR 2019),
     OP(pn=6, current=false, dp=MAY 2019)]    
    
    class OP{       
       Integer pn;      
       Boolean current;      
       String dp;       
    } 
    
    List<OP> filteredList11 = availablePT.get()
        .stream()
        .map(e->new OP(e.getPn(),**,e.getDp()))
        .collect(Collectors.toList());
    

    我有点困惑,如何推导逻辑,将单个循环中最小正整数的当前标志(**)更新为true。

  • 共有3个答案

    党博超
    2023-03-14

    以下是您的要求:

    AtomicBoolean isFirst = new AtomicBoolean(true);
        List<OP> filteredList11 = availablePT.get()
            .stream()
            .map(e->new OP(e.getPn(),**,e.getDp()))
            .sorted(Comparator.comparingInt(OP::getPn))
            .peek(e -> {
                            if (e.getPn() % 2 == 0) {
                                e.setCurrent(isFirst.getAndSet(false));
                            }
                        })
            .collect(Collectors.toList());
    
    韩晋
    2023-03-14

    你可以这样做:

    首先找到最不肯定的PT对象。

    Optional<PT> latestPositive = availablePT.stream()
                                 .filter(pt -> pt.getPn() > 0)
                                 .min(Comparator.comparingInt(PT::getPn));
    

    然后通过stream overainablePTlist创建OP对象。

    List<OP> filteredList11 = availablePT.stream()
                .map(pt -> new OP(pt.getPn(),
                                  pt.equals(latestPositive.orElse(null)), pt.getDp()))
                .collect(Collectors.toList());
    

    如果你有兴趣在使用单流这样做:

    首先编写一个自定义比较器。

     Comparator<PT> ptComparator = (o1, o2) -> {
            if (o2.getPn() < 0) {
                if (o1.getPn() > 0)
                    return -1;
            } else if (o2.getPn() > 0) {
                if (o1.getPn() < 0)
                    return 1;
            }
            return Integer.compare(o1.getPn(), o2.getPn());
        };
    

    然后用你的比较器排序列表

    AtomicInteger integer = new AtomicInteger(0);
     List<OP> filteredList11 = availablePT.stream()
              .sorted(ptComparator)
              .map(pt -> new OP(pt.getPn(), integer.incrementAndGet()==1, pt.getDp()))
              .collect(Collectors.toList());  
    
    危卜鹰
    2023-03-14

    这是另一种方法。有一个OP构造函数,它接受一个PT并映射所有字段,加上默认设置为false的额外布尔值。

    然后做这样的事情:

    List<OP> ops = availablePT.stream().map(dp -> {return new OP(dp);})
     .filter(line -> line.getPn()!=null && line.getPn().doubleValue()>=0)
     .sorted(Comparator.comparingInt(OP::getPn))
     .collect(Collectors.toList());
    if(ops!=null && !ops.isEmpty()) {
       ops.get(0).setCurrent(true);
    }
    

    这基本上是创建新的对象,然后过滤掉负值,然后对可能的对象进行排序,然后保证具有最小dp值的op是第一个,因此将其设置为布尔值为true

     类似资料:
    • 我尝试了以下方法,但在编辑归档后,它会更改样式,但也会更改列表中其他ListCell的样式。

    • 我有以下Java超类,每个属性都有构造函数、getter和setter: 和一个car子类,它扩展了vehicle超类,并具有几个独特的属性: 我创建一个新的vehicle对象链表,并向其中添加一个新的car对象: 我可以用下面这样的函数更改属于vehicle超级类的任何属性: 但是当我试图创建一个类似的函数来更改其中一个子类属性时,我得到了这个错误:“方法setWheels(int)对于类型Ve

    • 下表(按对象名称排序)列出了 Microsoft Office 中已有对象添加的属性。对象属性CommandBarButton Mask Picture CommandBars DisableAskAQuestionDropdown DisableCustomizeFileDialog AllowMultiSelect ButtonName DialogType FilterIndex Filte

    • 我有一个名为的对象,它描述了一个项目的买卖行为。与其他一些属性相比,它主要如下所示: 具有各自的吸气器和设置器。是该项目应出售/购买的金额,ItemData描述该项目的规格。PriceType是一个枚举,它是或。 我现在有一个方法,是哪个工作,在一个列表中找到最匹配的价格。我的所有价格都存储在一个简单称为的列表中。到目前为止,我的方法只是遍历列表,并返回与和匹配的第一个: 然而,这完全忽视了一个事

    • 我有一个按月-年字符串属性排序的对象列表。我的对象类定义如下 我想对会员人数、非会员人数、会员付款、非会员付款进行累计和 所以我的新对象列表如下 我尝试与但它给我所有的总和不累积。 非常感谢任何指点。

    • 问题内容: 我有一个像这样的JSON字符串: 我想将属性更新为,如果值为,并且值为。 我已经到了这一点,但是不确定如何进行: 我不知道怎么去的是一个孩子。 提前致谢。任何指针都很棒。 问题答案: 您可以使用属性作为键来访问对象: 对于您的示例,请尝试: