如何使用流从List <Entity>创建List <GroupEntity>?

时间:2019-07-26 20:50:24

标签: java java-stream

我收到一个实体列表,我需要将它们按2个字段(periodMonth和periodYear)进行分组,然后作为新列表返回。

要存储组,我创建了一个类GroupEntity。

我必须用于分组的字段不属于Entity本身,而是属于一个称为EntityPK的可嵌入类。

这是这些类的代码:

实体

let database: CKDatabase = ...
database.fetchAll(recordType: "User") { result in
    switch result {
        case .success(let users):
            // Handle fetched users, ex. save them to the database
        case .failure(let error):
            // Handle Error
        }
    }
}

EntityPK

@Entity
@Table(name = "Entity")
public class Entity {

    @EmbeddedId
    private EntityPK entityPk;

    @Column
    private String someValue;

小组课

@Embeddable
public class EntityPK {

    @Column
    private String periodMonth;

    @Column
    private String periodYear;

我可以遍历该列表,并创建一个以periodMonth / Year为键,以List为值的地图,如下所示:

public class GroupOfEntity {

    private String periodMonth;

    private String periodYear;

    private List<Entity> entities;

但是我该如何使用流?

类似

Set<GroupEntity> listOfGroupEntity = new HashSet<GroupEntity>();
        for(Entity entity: listOfEntity) {
            GroupEntity groupEntity = new GroupEntity();
            groupEntity.setPeriodMonth(entity.getEntityPk().getPeriodMonth());
            groupEntity.setPeriodYear(entity.getEntityPk().getPeriodYear());
            Optional<GroupEntity> findFirst = listOfGroupEntity.stream().filter(a -> a.equals(groupEntity)).findFirst();
            if(findFirst.isPresent()) {
                findFirst.get().getEntities().add(entity);
            }else {
                listOfGroupEntity.add(groupEntity);
            }
        }

并使用这些实体为每个组创建GroupEntity对象。

有可能吗?

2 个答案:

答案 0 :(得分:3)

假设 No实现了EntityPKequals,您首先构建hashCode,然后将其映射到Map<EntityPK, List<Entity>>。 / p>

假设 List<GroupOfEntity>具有适当的构造函数,您可以这样做:

GroupOfEntity

答案 1 :(得分:1)

首先,请执行以下操作:

class Car(pygame.sprite.Sprite):
    def __init__(self, surf, x, y, speed, angle):
        super().__init__()     
        self.surf = surf
        self.surf.set_colorkey(black)
        self.pos = pygame.math.Vector2(x, y)
        self.angle = angle
        self.speed = speed
        self.image = pygame.transform.rotate(self.surf, self.angle)
        self.rect  = self.image.get_rect(center=(x, y))

    def update(self):

        keys = pygame.key.get_pressed()
        if keys[pygame.K_a]:
            self.angle -= 10
        elif keys[pygame.K_d]:
            self.angle += 10

        dirvec = pygame.math.Vector2(0, self.speed).rotate(self.angle)
        if keys[pygame.K_w]:
            self.pos = self.pos - dirvec
        elif keys[pygame.K_s]:
            self.pos = self.pos + dirvec

        if self.pos.x > 800:
            self.pos.x = 0
        elif self.pos.x < 0:
            self.pos.x = 800
        elif self.pos.y > 600:
            self.pos.y = 0
        elif self.pos.y < 0:
            self.pos.y = 600

        self.image = pygame.transform.rotate(self.surf, -self.angle)
        self.rect  = self.image.get_rect(center = (round(self.pos.x), round(self.pos.y)))

然后从上面的Map创建GroupOfEntity。这两个步骤也可以合并。

这是进一步 Map<EntityPK, List<Entity>> groupEntities = entities.stream().collect(Collectors.groupingBy(Entity::getEntityPk)); 地图并创建stream的组合步骤:

GroupOfEntity

请在github上查看完整的运行示例