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

标签 java lambda java-8 java-stream

我是 Java 8 的新手,正在研究流。我正在尝试填充日期晚于指定日期的消息 ArrayList。我需要这个新的 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++ 行给我一个错误:

Local variable msgCount defined in an enclosing scope must be final or effectively final.

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

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

最佳答案

您可以使用 Stream.limit(maxSize)限制 Stream 中的元素数量:

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());
}

我在您的初始代码中更改了一些内容:

  • new GregorianCalendar() 替换为 Calendar.getInstance() .
  • 不使用forEach,您可以使用Collectors.toList() 直接收集列表中的所有元素。
  • 清理异常处理,将原始异常保存为原因,从而无需将堆栈跟踪写入 stderr。

关于java - 如何使用 Java 8 Streams 填充 ArrayList 直到达到指定的最大项目数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32782339/

相关文章:

java - 如何从 try-with-resources 捕获异常?

java - 在jsf中以2点小数格式显示数字

java - 以编程方式确定 IOException 的原因?

java - Java中Streams的正确使用

java - 创建自定义流

java - 生产消费者

java - lambda 表达式应该是最终的 FOR LOOP

C++11 作为回调传递的空函数的优化

java - 如何将 forEach 与 slf4j.logger.info 一起使用

java - 将 IntStream 转换为 Map