gpt4 book ai didi

java - java 8中的.net列表分组依据?

转载 作者:行者123 更新时间:2023-12-02 01:40:39 24 4
gpt4 key购买 nike

我收到了一个将代码从 C# 迁移到 java 8 的任务。我对下面的 C# 代码有疑问。

List<Log> lst = LogRepository.GetLogs(DateTime.Now.AddDays(-2), DateTime.Now);

return lst
.GroupBy(x => new { x.Title, x.ID })
.Select(x => x.OrderByDescending(y => y.DataChangeTime).FirstOrDefault())
.ToList();

是的,GroupBy 方法很简单,我知道它在做什么。但是,我不知道这一系列方法在做什么以及它会返回什么结果?最后,谁能给我一个java版本的解决方案吗?

最佳答案

@Rango 已经解释了 C# 代码。假设 C# 中的 Log 类的设计如下

class Log
{
public String title;
public String ID;
public DateTime dataChangeTime;
public String whatever;
...
}

和一个类似的 Java 类(例如,使用 LocalDateTime 而不是 DateTime),提供相同结果的 Java 表达式是:

Comparator<Log> comparator = (Log l1, Log l2) -> l2.dataChangeTime.compareTo(l1.dataChangeTime);    // sort descending
List<Log> resultantList = initialList.stream()
.collect(Collectors.groupingBy(l -> l.title + l.ID)).values().stream() // group according to title and id
.map(logs -> logs.stream().sorted(comparator).findFirst().get()) // sort and take the first
.collect(Collectors.toList()); // create the list

该表达式将所有具有相同标题和 ID 的 Log 对象分组在一起,即 l.title + l.ID 的值相同。如果分组条件更复杂,那么定义一个表示分组的类可能更有意义,例如

class LogGroup {

private String Title;
private String ID;

public LogGroup(String Title, String ID) {
this.Title = Title;
this.ID = ID;
}

@Override
public boolean equals(Object o) {

if (o == this) return true;
if (!(o instanceof LogGroup)) {
return false;
}
LogGroup logGroup = (LogGroup) o;
return Objects.equals(Title, logGroup.Title) &&
Objects.equals(ID, logGroup.ID);
}

@Override
public int hashCode() {
return Objects.hash(Title, ID);
}
}

该类必须同时实现 equalshashCode 方法(即单独实现 equals 方法),这一点至关重要还不够)。

使用该类,Java 表达式将变为:

Comparator<Log> comparator = (Log l1, Log l2) -> l2.dataChangeTime.compareTo(l1.dataChangeTime);
List<Log> resultantList = initialList.stream()
.collect(Collectors.groupingBy(l -> new LogGroup(l.title, l.ID))).values().stream()
.map(logs -> logs.stream().sorted(comparator).findFirst().get())
.collect(Collectors.toList());

类似的列表

private static List<Log> getInitialList() {
List<Log> initialList = new ArrayList<>();
initialList.add(new Log("Title 6", "ID 6", LocalDateTime.of(2017, 1, 18, 23, 15, 12), "A"));
initialList.add(new Log("Title 3", "ID 3", LocalDateTime.of(2005, 4, 20, 16, 10, 10), "B"));
initialList.add(new Log("Title 1", "ID 1", LocalDateTime.of(2010, 10, 25, 3, 5, 2), "C"));
initialList.add(new Log("Title 2", "ID 2", LocalDateTime.of(2018, 2, 18, 21, 13, 32), "D"));
initialList.add(new Log("Title 3", "ID 3", LocalDateTime.of(2016, 5, 16, 15, 23, 15), "E"));
initialList.add(new Log("Title 1", "ID 1", LocalDateTime.of(2012, 2, 8, 14, 46, 28), "F"));
initialList.add(new Log("Title 6", "ID 6", LocalDateTime.of(1996, 1, 28, 22, 26, 34), "G"));
initialList.add(new Log("Title 3", "ID 3", LocalDateTime.of(2007, 4, 15, 2, 5, 55), "H"));
initialList.add(new Log("Title 6", "ID 3", LocalDateTime.of(2018, 1, 15, 20, 15, 10), "I"));
return initialList;
}

由两个表达式处理如下

Title 1    ID 1    2012-02-08 14:46:28    F
Title 3 ID 3 2016-05-16 15:23:15 E
Title 2 ID 2 2018-02-18 21:13:32 D
Title 6 ID 6 2017-01-18 23:15:12 A
Title 6 ID 3 2018-01-15 20:15:10 I

结果列表本身未排序(使用Collections.sort(...)很容易实现),但这也适用于 C# 输出。

关于java - java 8中的.net列表分组依据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54476833/

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