不知道为什么这个 stream() 在这个嵌套列表上不起作用?

Don't know why this stream() not working on this nested list?

我有两个嵌套列表类型,如下所示:

    List<Team> team;
    
    public class Team{
        private String teamId;
        private List<TeamUsers> teamUsers;
        --getter setter...
    }

    
    public class TeamUsers{
        private int TeamUsersId;
        private int active;
        --getter setter...

    }

我要return所有的List,以及每个Team对象里面,如果TeamUsers对象active=0,那么就不要return这个TeamUsers对象嵌套在List中。 这是我的代码:

List<Team> alldata = (List<Team>) teamRepo.findAll();
List<Team> finalResult = alldata.stream()
                .filter(a -> a.getTeam_users().stream().allMatch(b -> b.getActive() == 1)).collect(Collectors.toList());

只有我return第一队全部TeamUsers.active = 1.

在第二组中,我确实有一些 TeamUsers.active = 1 和一些 TeamUsers.active = 0。

我犯了什么错误?

您要修改用户列表:

List<Team> alldata = (List<Team>) teamRepo.findAll();

List<Team> finalResult = alldata.stream()
        .map(t -> new Team(t.getTeamId(),
                           t.getTeamUsers().stream()
                                   .filter(u -> u.getActive() == 1)
                                   .collect(Collectors.toList())))
        .filter(t -> t.getTeamUsers().size() != 0)
        .collect(Collectors.toList());

这是一些类似的代码。为简洁起见,使用 Java 16+ records 功能,但这不是必需的。

Member class.

package work.basil.team;

public record Member( int id , String name , int status ) { } // Status: 0=inactive, 1=active.

Team class.

package work.basil.team;

import java.util.List;
import java.util.UUID;

public record Team( UUID id , String name , List < Member > memberList ) { }

填充一些数据。

Team alphaTeam = new Team(
        UUID.fromString(  "b4c94867-8ac7-4caf-bf49-b79df92cff82" ) ,
        "Alpha",
        List.of(
                new Member(
                        1 ,
                        "Alice",
                        1
                ),
                new Member(
                        2 ,
                        "Bob",
                        1
                )
        )
);

Team betaTeam = new Team(
        UUID.fromString(  "9d12160a-94cc-45c6-a465-12cdf3d1a503" ) ,
        "Beta",
        List.of(
                new Member(
                        3,
                        "Carol",
                        0
                ),
                new Member(
                        4,
                        "Davis",
                        1
                )
        )
);

Team gammaTeam = new Team(
        UUID.fromString(  "f440ac2d-9175-47d8-a5e2-3102e0d162bc" ) ,
        "Gamma",
        List.of(
                new Member(
                        5 ,
                        "Ernestine",
                        1
                ),
                new Member(
                        6 ,
                        "Frank",
                        1
                )
        )
);

List < Team > teams = List.of( alphaTeam , betaTeam , gammaTeam );

用于报告团队集合的代码,以仅查找所有成员都处于活动状态的团队。我们的逻辑在这里被翻转,测试我们在哪里找到任何处于非活动状态的成员。

List<Team> teamsWhoseMembershipIsEntirelyActive =
        teams
                .stream()
                .filter(
                        team -> ! team.memberList().stream().anyMatch( member -> member.status() == 0 )
                )
                .toList()
;

teamsWhoseMembershipIsEntirelyActive = [Team[id=b4c94867-8ac7-4caf-bf49-b79df92cff82, name=Alpha, memberList=[Member[id=1, name=Alice, status=1], Member[id=2, name=Bob, status=1]]], Team[id=f440ac2d-9175-47d8-a5e2-3102e0d162bc, name=Gamma, memberList=[Member[id=5, name=Ernestine, status=1], Member[id=6, name=Frank, status=1]]]]

您也可以删除 ! not 运算符,并使用针对值的 .allMatch 而不是 .anyMatch 的谓词1 而不是 0.

List<Team> teamsWhoseMembershipIsEntirelyActive =
        teams
                .stream()
                .filter(
                        team -> team.memberList().stream().allMatch( member -> member.status() == 1 )
                )
                .toList()
;

顺便说一下,最好使用 Java 的枚举功能,而不是仅仅 int 来表示您的 active/inactive 状态。

使用枚举提供 type-safety, ensures valid values, and makes your code more self-documenting

更改 Member class 以嵌套枚举定义。枚举对象是常量,因此根据 Java 命名约定以全部大写命名。

package work.basil.team;

public record Member( int id , String name , Status status ) {
    public enum Status { ACTIVE , INACTIVE, UNKNOWN }
}

更改我们的数据填充代码以使用枚举对象。

Team alphaTeam = new Team(
        UUID.fromString(  "b4c94867-8ac7-4caf-bf49-b79df92cff82" ) ,
        "Alpha",
        List.of(
                new Member(
                        1 ,
                        "Alice",
                        Member.Status.ACTIVE
                ),
                new Member(
                        2 ,
                        "Bob",
                        Member.Status.ACTIVE
                )
        )
);

Team betaTeam = new Team(
        UUID.fromString(  "9d12160a-94cc-45c6-a465-12cdf3d1a503" ) ,
        "Beta",
        List.of(
                new Member(
                        3,
                        "Carol",
                        Member.Status.INACTIVE
                ),
                new Member(
                        4,
                        "Davis",
                        Member.Status.ACTIVE
                )
        )
);

Team gammaTeam = new Team(
        UUID.fromString(  "f440ac2d-9175-47d8-a5e2-3102e0d162bc" ) ,
        "Gamma",
        List.of(
                new Member(
                        5 ,
                        "Ernestine",
                        Member.Status.ACTIVE
                ),
                new Member(
                        6 ,
                        "Frank",
                        Member.Status.ACTIVE
                )
        )
);

List < Team > teams = List.of( alphaTeam , betaTeam , gammaTeam );

更改谓词以测试枚举对象而不是 int 数字。

List<Team> teamsWhoseMembershipIsEntirelyActive =
        teams
                .stream()
                .filter(
                        team -> team.memberList().stream().allMatch( member -> member.status().equals( Member.Status.ACTIVE ) )
                )
                .toList()
;

查看此代码转换为 Java 12 和 running live at IdeOne.com