考虑一下,我有下面的课.

public class Employee {

private Integer id;
private Integer parentId;
private int value;
}

现在我有以下记录.

    Employee employee1 = new Employee(1, null, 4);
    Employee employee2 = new Employee(2, 1, 4);
    Employee employee3 = new Employee(3, null, 8);
    Employee employee4 = new Employee(4, 1, 3);
    Employee employee5 = new Employee(5, 2, 11);

所以parentIdemployee中的id,而employee是另一个employee的老板.

问题是找出employee的值的100和它的父级(如果有),或者按原样返回值.所以在这种情况下,结果应该是.

id value
1 4
2 8
3 8
4 7
5 15

如何使用Java8流实现这一点?我试过以下方法:;

  Optional<Integer> first = employees.stream().map(a -> {
                int sum = 0;
                employees.stream().map(b -> {
                    if (Objects.equals(a.id, b.parentId)) {
                        sum = sum + a.value + b.value;
                    }else{
                        sum  = sum + a.value;
                    }
                    return sum;
                });
                return sum;
            }
    ).findFirst();

但是我得到了sum变量的错误,它应该是final或者实际上是final.

推荐答案

实现这一点的最有效方法是创建一个103,它将允许通过其id检索Employee中的value.

然后,为了将每个Employee中的value与其父项的value相结合,如果没有条目(即父项为null),则使用1050中的value.

下面的方法生成一个map,其中id用作key,员工的value用作value.

public static Map<Integer, Integer> getEmplValueById(List<Employee> employees) {
    return employees.stream()
            .collect(Collectors.toMap(Employee::getId,
                                      Employee::getValue));
}

下面的方法创建一个map,其中id用作key,员工的101用作 map 的value.

public static Map<Integer, Integer> getEmplSumById(List<Employee> employees,
                                                   Map<Integer, Integer> valueById) {
    return employees.stream()
            .collect(Collectors.toMap(Employee::getId,
                        empl -> empl.getValue() + 
                                valueById.getOrDefault(empl.getParentId(), 0)));
}

main()

public static void main(String[] args) {
    List<Employee> employees = List.of(
            new Employee(1, null, 4),
            new Employee(2, 1, 4),
            new Employee(3, null, 8),
            new Employee(4, 1, 3),
            new Employee(5, 2, 11));

    Map<Integer, Integer> valueById = getEmplValueById(employees);

    getEmplSumById(employees, valueById)
         .forEach((k, v) -> System.out.printf("ID %d \t value %d\n", k, v));
}

Output

ID 1     value 4
ID 2     value 8
ID 3     value 8
ID 4     value 7
ID 5     value 15

Java相关问答推荐

如何用Java表示C++类以通过FFI使用?

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

如何在Docker容器中使用wireock—Webhooks阻止请求?

如何使用jooq generator将表名和列名映射为人类可读的?

为什么BasicComboBoxRenderer在文本不存在或文本为空的情况下设置两次文本?

所有 case 一起输入时输出错误,而单独放置时输出正确

DTO到实体,反之亦然,控制器和服务之间的哪一层应该处理转换?

如何获得执行人?

FALSE:它应该在什么时候使用?

OpenGL ES 3.0-纹理黑色

Java泛型类方法的静态返回类型是否被类型擦除?

使用While循环打印素数,无法正常工作

来自外部模块的方面(对于Java+Gradle项目)不起作用

具有多个模式的DateTimeForMatter的LocalDate.parse失败

为什么这种递归会有这样的行为?

在线程Java中调用Interrupt()之后调用Join()

Java递归泛型是否可以被视为继承和重写的语法糖

如何在Selenium上继续使用最新的WebDriver版本

如何以事务方式向ibmmq发送消息

";重复键的值提示唯一约束«;livre_genre_pkey»";例外