gpt4 book ai didi

java - 如何在流中使用两个过滤器进行不同的转换

转载 作者:搜寻专家 更新时间:2023-10-30 21:22:40 24 4
gpt4 key购买 nike

我只需要针对特定​​条件执行转换。我做这个转变:

// filter 1: less date - group by max date by groupId
List<Info> listResult = new ArrayList<>(listInfo.stream()
.filter(info -> info.getDate().getTime() < date.getTime())
.collect(Collectors.groupingBy(Info::getGroupId, Collectors.collectingAndThen(
Collectors.reducing((Info i1, Info i2) -> i1.getDate().getTime() > i2.getDate().getTime() ? i1 : i2),
Optional::get))).values());

但是对于超过指定日期的情况,我不需要转换任何东西,我只需要返回这个数据:

// filter 2: more date - nothing change in list
List<Info> listMoreByDate = listInfo.stream()
.filter(info -> info.getDate().getTime() >= date.getTime())
.collect(Collectors.toList());

接下来,为了组合这两个过滤器 - 我组合了两个列表:

listResult.addAll(listMoreByDate);

我的问题是,这可以在一个流中完成吗?因为过滤器 2 完全没有用,它只是返回一个针对此条件的列表。

是否可以用一个连续表达式执行这些转换?

我的完整代码:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

public class App {
public static void main(String[] args) throws ParseException {
Info info1 = new Info(1L, getDateFromStr("2018-02-02T10:00:00"), 3L);
Info info2 = new Info(2L, getDateFromStr("2018-02-02T12:00:00"), 3L);
Info info3 = new Info(3L, getDateFromStr("2018-02-05T12:00:00"), 6L);
Info info4 = new Info(4L, getDateFromStr("2018-02-05T10:00:00"), 6L);

Date date = getDateFromStr("2018-02-03T10:10:10");

List<Info> listInfo = new ArrayList<>();
listInfo.add(info1);
listInfo.add(info2);
listInfo.add(info3);
listInfo.add(info4);

// filter 1: less date - group by max date by groupId
List<Info> listResult = new ArrayList<>(listInfo.stream()
.filter(info -> info.getDate().getTime() < date.getTime())
.collect(Collectors.groupingBy(Info::getGroupId, Collectors.collectingAndThen(
Collectors.reducing((Info i1, Info i2) -> i1.getDate().getTime() > i2.getDate().getTime() ? i1 : i2),
Optional::get))).values());

// filter 2: more date - nothing change in list
List<Info> listMoreByDate = listInfo.stream()
.filter(info -> info.getDate().getTime() >= date.getTime())
.collect(Collectors.toList());

listResult.addAll(listMoreByDate);

System.out.println("result: " + listResult);
}

private static Date getDateFromStr(String dateStr) throws ParseException {
return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").parse(dateStr);
}
}

class Info {
private Long id;
private Date date;
private Long groupId;

public Info(Long id, Date date, Long groupId) {
this.id = id;
this.date = date;
this.groupId = groupId;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public Date getDate() {
return date;
}

public void setDate(Date date) {
this.date = date;
}

public Long getGroupId() {
return groupId;
}

public void setGroupId(Long groupId) {
this.groupId = groupId;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Info info = (Info) o;
return Objects.equals(id, info.id) &&
Objects.equals(date, info.date) &&
Objects.equals(groupId, info.groupId);
}

@Override
public int hashCode() {

return Objects.hash(id, date, groupId);
}

@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Info{");
sb.append("id=").append(id);
sb.append(", date=").append(date);
sb.append(", groupId=").append(groupId);
sb.append('}');
return sb.toString();
}
}

最佳答案

我看不出有什么比

更简单的了
List<Info> listResult = Stream.concat(
listInfo.stream()
.filter(info -> info.getDate().getTime() < date.getTime())
.collect(Collectors.toMap(Info::getGroupId, Function.identity(),
BinaryOperator.maxBy(Comparator.comparing(Info::getDate))))
.values().stream(),
listInfo.stream()
.filter(info -> info.getDate().getTime() >= date.getTime())
)
.collect(Collectors.toList());

因为这两个操作根本不同。在第一步中构建一个 Map 是不可避免的,因为它将用于识别具有相同 getGroupId 属性的项目。

也就是说,您应该考虑从使用 Date 切换到 java.time API。

关于java - 如何在流中使用两个过滤器进行不同的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53154515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com