我是 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/