不知道为什么这个 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。
我有两个嵌套列表类型,如下所示:
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。