【问题标题】:How to check if list has more then 3 elements using Java8如何使用 Java 8 检查列表是否包含超过 3 个元素
【发布时间】:2022-01-19 00:37:42
【问题描述】:

我有一个接受对象列表的方法。

我想遍历该列表并检查该列表是否包含 3 个以上的元素。如果是这样,我想抛出错误 You can only add 3 elements

如果没有,我想将这些元素保存在数据库中。

在这种情况下,我想使用 Java 8 流。

到目前为止,我有这个代码:

public List<MyObject> addMyObject(List<MyObject> myObject) {

    if (playingStyle.isEmpty()) {
        throw new IllegalArgumentException("object cannot be null");
    }

    return myObject.stream()
        .limit(3)
        .map( ps -> {
            try {
                return repository.save(new MyObject(
                    ps.getName(), ps.getAverage(), ps.getPriority()
                ));
            } catch (Exception e) {
                log.warn("MyObject fields not correct {} {}", ps, e.getMessage());
                throw e;
            }
        })
        .collect(Collectors.toList());
}

我曾尝试使用.limit(),但它的作用是获取前 3 个对象(如果我发送了 4 个)并保存它们,最后一个就忘记了。

我想要实现的是如果列表为空返回错误,如果列表大小大于 3 则返回错误,但使用 Java 8。

【问题讨论】:

  • list.size() > 3 有什么问题?
  • 保存时为什么要创建new MyObject()
  • @ÓscarLópez 没有任何问题,但我想看看如何使用 Java 8 :)
  • @user9347049 在 Java 8 中,你可以像在 Java 1.0 中那样做 :) 。这绝不是流的好用例,流用于以惰性方式处理(可能)大量元素,对每个元素执行一些操作和/或累积它们;经历使用流而不是使用具有相同效果的size() 之类的O(1) 操作的所有开销,这是相当大的杀伤力...
  • @ÓscarLópez 好吧,实际上就像在 JDK 1.2 中一样。

标签: java java-8 java-stream


【解决方案1】:

对于List,只需检查size 属性。

对于Stream,您可以这样做:

import java.util.*;
import java.util.stream.*;

class Main {
    
    private static Boolean hasThreeOrMoreElements(final Stream s) {
        return s.limit(3).count() >= 3;
    }
    
    public static void main(String[] args) {
        System.out.println(hasThreeOrMoreElements(Arrays.asList(1).stream()));
        System.out.println(hasThreeOrMoreElements(Arrays.asList(1, 2).stream()));
        System.out.println(hasThreeOrMoreElements(Arrays.asList(1, 2, 3).stream()));
        System.out.println(hasThreeOrMoreElements(Arrays.asList(1, 2, 3, 4, 5, 6).stream()));
    }
}

【讨论】:

    【解决方案2】:

    这样的?

    public List < MyObject > addMyObject(List < MyObject > myObject) {
    
        if (playingStyle.isEmpty()) {
            throw new IllegalArgumentException("playingStyle cannot be null");
        }
    
        if (myObject.size() > 3)
            throw new IllegalArgumentException("You can only add 3 elements");
    
        return myObject.stream()
            .limit(3)
            .map(ps -> {
                try {
                    return repository.save(new MyObject(ps.getName(), ps.getAverage(), ps.getPriority()));
                } catch (Exception e) {
                    log.warn("MyObject fields not correct {} {}", ps, e.getMessage());
                    throw e;
                }
            }).collect(Collectors.toList());
    }
    

    另外,我会将repository.save(new MyObject(ps.getName(), ps.getAverage(), ps.getPriority())); 更改为repository.save(ps);

    【讨论】:

    • 是否可以检查列表是否为空以及流中的大小是否小于 3?
    • @user9347049 流对现有列表进行操作,而不验证其属性。您对事先检查条件有何反对?
    猜你喜欢
    • 2021-06-24
    • 2014-04-30
    • 2016-05-12
    • 2016-06-25
    • 2018-11-17
    • 2014-07-31
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多