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

如何使用 Java 8 Streams 填充 ArrayList,直到达到指定的最大项目数?

汝志
2023-03-14

我是Java 8的新手,我正在研究流。我正在尝试填充一个日期在指定日期之后的消息数组列表。我需要这个新的ArrayList最多有16个项目。我尝试了以下方法:

private static final int MAX_MESSAGES_NUM = 16;

public ArrayList<Messages> filterMessagesByData(Calendar filterDate, ArrayList<Messages> messagesList) {
    ArrayList<Messages> filteredMessages = new ArrayList<Messages>();
    int msgCount = 0;
    messagesList.stream().filter(message -> {

        Calendar msgDate = new GregorianCalendar();
        try {
            msgDate.setTime(new SimpleDateFormat("dd/MM/yy").parse(message.getDate()));
            msgCount ++;
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
        return (msgDate.compareTo(filterDate) >= 0) && msgCount < MAX_MESSAGES_NUM;
    }).forEach(filteredMessages::add);

    return filteredMessages;
}

但它在 msgCount 行给我一个错误:

封闭范围中定义的局部变量msgCount必须是final或实际上是final。

我怀疑外部变量不能在lambda表达式中修改。

有没有一种方法可以使用流和过滤器来实现?

共有1个答案

唐修能
2023-03-14

您可以使用<code>Stream。limit(maxSize)以限制中的元素数:

public List<Messages> filterMessagesByData(Calendar filterDate, ArrayList<Messages> messagesList) {
    return messagesList.stream().filter(message -> {
        Calendar msgDate = Calendar.getInstance();
        try {
            msgDate.setTime(new SimpleDateFormat("dd/MM/yy").parse(message.getDate()));
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
        return msgDate.compareTo(filterDate) >= 0;
    }).limit(MAX_MESSAGES_NUM).collect(Collectors.toList());
}

我在您的初始代码中更改了几件事:

  • 新的GregorianCalendar()被替换为Calendar.getInstance()
  • 您可以使用Collectors直接收集列表中的所有元素,而不是使用forEach。toList()
  • 清理了异常处理,以便将原始异常保存为原因,从而不必将stacktrace写入stderr
 类似资料:
  • 问题内容: 我需要用ArrayList填充JComboBox。有什么办法吗? 问题答案: 使用ArrayList类的方法并将其传递给 有关更多信息,请参见JavaDoc和教程。

  • 问题内容: 从问题的答案如何对varchar []使用array_agg() , 我们可以创建一个自定义的聚合函数来聚合Postgres中的n维数组,例如: 一个约束是值必须共享 相同的数组范围和相同的长度 ,处理空值和不同的长度是行不通的。 从答案: 没有办法解决,数组类型不允许在Postgres中出现这种不匹配的情况。您可以使用NULL值填充数组,以便所有维都具有匹配范围。 我有像这样的行 我

  • 问题内容: 我在数组列表中有hashbles。 这里的信息包含我的哈希表。我如何才能将此“信息”对象转换为其他类/意图? 谢谢… 问题答案: 创建一个延伸的类与 对 Custom.java 传递到下一个活动。 在下一个活动中检索

  • 我遇到了以下问题:当手机应该输入时,我需要实现这种情况的解决方案。这部手机应该有不可移动的部分,最后四个数字应该在开头填写下划线,然后当用户键入下划线时,应该将其更改为数字,例如: < code> 12345____ - 我实现了不可移除的部分。我是这样做的: 但现在我不明白,如何处理下划线的逻辑。我尝试在< code>doAfterTextChanged中添加下划线,比如if

  • 问题内容: 我的Android应用程序需要使用中填充ListView数据ArrayList。 我这样做很麻烦。有人可以帮我提供代码吗? 问题答案: 你需要通过进行操作,以使ArrayList(或任何其他集合)适应布局中的项目(ListView,Spinner等)。 这是Android开发人员指南所说的: 一个管理任意对象数组支持的。默认情况下,此类期望提供的资源ID引用单个。如果要使用更复杂的布局