【发布时间】:2019-01-31 09:48:32
【问题描述】:
我是 Java lambda 表达式的新手,一直在努力解决以下问题:
我正在尝试将以下 Activity 对象列表过滤到具有最近开始时间的单个 Activity:
{
Name: "activity1"
Id: "abc-123"
Fields: [
{ key: "startTime", value: "2018-08-24T12:00:01" },
{ key: "foo", value: "bar" },
{ key: "baz", value: "zoop" }
]
},
{
Name: "activity2"
Id: "def-456"
Fields: [
{ key: "bat", value: "zap" },
{ key: "startTime", value: "2018-08-23T12:00:01" },
{ key: "cat", value: "dog" }
]
},
{
Name: "activity3"
Id: "ghi-789"
Fields: [
{ key: "flim", value: "flam" },
{ key: "boop", value: "bop" },
{ key: "startTime", value: "2018-08-22T12:00:01" }
]
}
基本上,每个对象都有一个内部字段列表,这些字段不按特定顺序出现,我想根据具有最大日期的“startTime”字段将父集合过滤为一项。
对于示例数据,目标是仅返回名称为“activity1”的对象。请注意,字段对象在我的数据中出现的顺序没有特定的顺序。此外,如果一个活动的开始时间与另一个活动的开始时间相匹配,则代码应采用集合中最先出现的项目。
假设活动和字段在一个列表中,并且我的活动类上有getter/setter,这是我开始的,但我知道这是不正确的:
activities().stream().filter(activity ->
activity.getFields().stream()
.filter(field -> field.getKey().equals("startTime"))
.max((field1, field2) -> {
Date date1 = Date.from(Instant.parse(field1.getValue()));
Date date2 = Date.from(Instant.parse(field2.getValue()));
return date1.compareTo(date2);
}).isPresent()
).findAny().get();
任何帮助或我应该如何处理的示例将不胜感激。谢谢!
Edit-1:
我正在使用的实际Activity 和Field 类是从第3 方库中检索的,并不是我自己设计的。以下是它们的外观:
public class Activity {
private String id;
private String name;
private List<Field> fields;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Field> getFields() {
return fields;
}
public void setFields(List<Field> fields) {
this.fields = fields;
}
}
public class Field {
private String key;
private String value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
【问题讨论】:
-
你能提供你的列表项的类别吗?
-
@EmreSavcı 我已经在问题中添加了edit-1,并举了一个例子。谢谢!
-
由于您的日期时间字符串没有偏移量,
Instant.parse几乎不起作用。使用LocalDateTime.parse。并且不要使用早已过时且设计不佳的Date类,因为LocalDateTime和Instant可以直接比较。
标签: java datetime lambda max filtering