【问题标题】:Find maximum value of a attribute in a list of custom objects using lamdaj使用 lamdaj 在自定义对象列表中查找属性的最大值
【发布时间】:2016-11-07 03:50:35
【问题描述】:

我试图找出一种方法来从包含自定义对象的list 中获取属性的最大值及其对象引用。

下面是我的代码,我应该在这里使用java 8 lambda expressions。我不允许使用任何 google guava 库。

我的问题是如何确定来自CcarReportPreferenceConfig 对象的sequenceNumber 属性是否在列表中。

序列号类似于1 or 2 or 3 or 4。如果我有 5 个 CcarReportPreferenceConfig 对象并且每个对象的序列号都像 1,2,3,4,5 我需要确定 5 是最大的

List<CcarReportPreferenceConfig> ccarReportPreferenceConfigs = ccarReportPrefConfigMapper.ccarReportPrefConfigDTOsToCcarReportPrefConfigs(ccarReportPrefConfigDTOList);
for (CcarReportPreferenceConfig ccarReportPreferenceConfig : ccarReportPreferenceConfigs) {
   if (ccarReportPreferenceConfig.getSequenceNumber().intValue() == 1) {
       ccarReportPreferenceConfig.setRejectSequence("DQM");
   } else if (ccarReportPreferenceConfig.getSequenceNumber()==LargestNumber){
       ccarReportPreferenceConfig.setRejectSequence("DQM");
   } else {
       ccarReportPreferenceConfig.setRejectSequence("S2");
   }
}

【问题讨论】:

    标签: lambda java-8


    【解决方案1】:
    public class MaxFromAList {
    
        int sequence = 0;
        String code = "";
    
        public String getCode() {
            return code;
        }
    
        public void setCode(String code) {
            this.code = code;
        }
    
        public MaxFromAList(int sequence) {
            this.sequence = sequence;
        }
    
        public int getSequence() {
            return sequence;
        }
    
        public static void main(String[] args){
    
            List<MaxFromAList> list = new ArrayList<MaxFromAList>();
            list.add(new MaxFromAList(1111));
            list.add(new MaxFromAList(2));
            list.add(new MaxFromAList(654643));
            list.add(new MaxFromAList(41));
            list.add(new MaxFromAList(500));
    
            list.stream().max(Comparator.comparing(MaxFromAList::getSequence))
                .ifPresent(max -> max.setCode("MAXCODE"));
    
            list.stream().filter(i -> !i.getCode().equals("MAXCODE")).forEach(ele -> setIdentificationCode(ele));
    
    
            printMyList(list);
        }
    
        public static void setIdentificationCode(MaxFromAList element){
            switch (element.sequence){
                case 1:
                    element.setCode("DQM");break;
                default:
                    element.setCode("");
            }
        }
    
        public static void printMyList(List<MaxFromAList> mylist){
            mylist.stream().forEach( o -> System.out.println("Sequence : " + o.sequence + "  Code : "+ o.getCode()));
        }
    }
    

    【讨论】:

    • 你不需要写(a,b) -&gt; { return expression; },一个简单的(a,b) -&gt; expression就足够了。无论如何,通过使用工厂方法Comparator.comparing(o -&gt; o.sequence) 而不是(first, second)-&gt;{ return (first.sequence &gt; second.sequence)? 1 : (first.sequence == second.sequence)? 0 : -1; },您可以节省更多的输入(并重复自己)...
    • @Holger 感谢您的精确定位。 Comparator#comparing。欣赏它:)
    • @Holger 我对 Java 8 还是很陌生。请您纠正一下并将您的反馈合并到代码中。这对我有很大帮助:)
    • @Balaji 考虑到 Holger 的 评论,我更新了答案
    • @SergeyLagutin 非常感谢。另一个问题是我们正在通过将 maxvalue 的对象的 maxcode 设置为 MAXCODE 来进行调整。没有它就没有办法生活吗?如果我在我的类中使用比较器并对其进行排序,那么列表将包含索引 0 处的最高对象。在 Java 8 lamda 中是否也有一种方法可以在不设置或修改属性值的情况下进行操作
    猜你喜欢
    • 2019-09-14
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2017-09-22
    • 2023-03-16
    • 2017-06-29
    • 1970-01-01
    相关资源
    最近更新 更多