当前位置: 首页 > 知识库问答 >
问题:

Java 8-如何使用lambda、groupingBy和summingInt以及使用按位运算符

秋阳荣
2023-03-14
public class CheckIn {
    public int id;
    public String day;
    public int workingHours;
    public boolean inProgress;

    public CheckIn(String day, in hours, boolean inProgress) {
        this.day = day;
        this.workingHours = hours;
        this.inProgress = inProgress;
    }
}
// Suppose this is the inputs 
List<CheckIn> checkinsList = new ArrayList<>();
checkinsList.add(new CheckIn("26-11-2015",6,true));
checkinsList.add(new CheckIn("27-11-2015",6,false));
checkinsList.add(new CheckIn("26-11-2015",6,false));
checkinsList.add(new CheckIn("27-11-2015",4,false));
checkinsList.add(new CheckIn("26-11-2015",1,false));
checkinsList.add(new CheckIn("28-11-2015",6,false));
checkinsList.add(new CheckIn("28-11-2015",6,false));
checkinsList.add(new CheckIn("28-11-2015",6,true));


List<CheckIn> summary = new ArrayList<>();

checkinsList.stream().collect(Collectors.groupingBy(Function.identity(),
    () -> new TreeMap<>(
        Comparator.<CheckIn, String>comparing(entry -> entry.day)),
        Collectors.summingInt(entry -> entry.duration))).forEach((e, sumTargetDuration) -> {
        CheckIn entry = new CheckIn();
        entry.day = e.day;
        entry.duration = sumTargetDuration;
        // Here my something like what I need?
        entry.inProgress = e.inProgress;
        summary.add(entry);
});
  • 第一项“26-11-2015”,13,true<--true,因为“26-11-2015”一天有1项为true。
  • 第二项“27-11-2015”,10,假
  • 第三项“28-11-2015”,18,真

我希望总结带有inprogresstrue,如果当天有任何条目haveinprogress==true,它适用于lambda吗?

共有1个答案

漆雕宏浚
2023-03-14

您需要为此任务生成自定义收集器。问题是没有内置收集器将多个收集器组合在一起并应用一个整理操作。在本例中,我们需要组合3个收集器:summingintreducation,它们将每个inprogress,以及mapping,它们将映射到当天。

下面的类将在收集过程中保存汇总,并相应地计算结果。我们可以添加关于当天的额外检查,因为在整个过程中它应该是相同的,但为了简单起见,我省略了这些检查。

public class CheckInSummary {

    private int workingHours;
    private boolean inProgress;
    private String day;

    public void accept(CheckIn checkIn) {
        workingHours += checkIn.workingHours;
        inProgress = inProgress || checkIn.inProgress;
        day = checkIn.day;
    }

    public CheckInSummary combine(CheckInSummary summary) {
        workingHours += summary.workingHours;
        inProgress = inProgress || summary.inProgress;
        return this;
    }

    public CheckIn finish() {
        return new CheckIn(day, workingHours, inProgress);
    }

}

然后,可以使用以下方法从该类创建收集器:

private static Collector<CheckIn, ?, CheckIn> summary() {
    return Collector.of(
                CheckInSummary::new,
                CheckInSummary::accept,
                CheckInSummary::combine,
                CheckInSummary::finish
           );
}
List<CheckIn> result = 
      new ArrayList<>(checkinsList.stream()
                                  .collect(groupingBy(c -> c.day, summary()))
                                  .values());
[[27-11-2015, 10, false], [26-11-2015, 13, true], [28-11-2015, 18, true]]
 类似资料:
  • 嗨, 我还尝试使用com.querydsl.core.types.dsl.expressions和com.querydsl.core.types.predicate,如下所示: 但我得到了一个无效的运算符和错误。 怎么会这样呢?

  • 考虑以下代码: 我可以理解Python(和其他语言)中的算术运算符,但我从来没有很好地理解过“按位”运算符。在上面的示例中(来自Python书籍),我理解左移位,但不理解其他两个。 此外,位运算符实际用于什么?我想举一些例子。

  • 问题内容: 我想知道如何实现由位表示的位串的k 循环 右移。 这些代码所做的全部是 返回0 ,如何使其循环移位? 问题答案: 这应该工作: 另请参阅Wikipedia上有关循环移位的文章。

  • 问题内容: 我正在使用Java lambda对列表进行排序。 如何以相反的方式对其进行排序? 我看到了这篇文章,但是我想使用java 8 lambda。 这是我的代码(我用* -1)作为破解 问题答案: 您可以调整在Java中如何以降序对ArrayList 排序的方法中链接的解决方案通过将其包装在lambda中: 请注意, f2 是的第一个参数,而不是第二个,因此结果将相反。

  • 我想得到以下数据结构:Map 给定的是一个包含字段als原语(位置、目标、距离)或作为键(位置)加映射(目标)的类。从每个独特的位置,一个人可以瞄准多个目的地(按距离)。 关于第二个代码段:结果应该与第一个代码中的结果相同。唯一的区别是,LocationPair中提供的数据已被进一步处理,因此目的地和距离已被放入其目标地图中。 我知道这一定是可能的,但不知何故,我无法弄清楚如何完成它。上面的流代码

  • 问题内容: 我有一些对字节执行按位运算的C#代码。我正在golang尝试做同样的事情,但是遇到了困难。 C#中的示例 我读过golang无法对字节类型执行按位运算。因此,我是否必须将代码修改为uint8类型才能执行这些操作?如果是这样,是否有一种干净,正确/标准的方法来实现? 问题答案: Go当然可以对类型进行按位运算,这只是的别名。我必须对您的代码进行的唯一更改是: 变量声明的语法 在将其添加到