How to filter a list with a property of an object

2019-05-17 08:43发布

For example, there are two classes:

class Team { 
 List<Player> players; //with getter & setter
}
class Player{
  String name; //with getter & setter
  int number;  //with getter & setter
}

So, if there are three teams:

Red Team : Adam(4), Tom(5), Peter(11)

Blue Team : Ken(5), Justin(11)

Black Team : Kim(4), Jackal(3)

I want to use lambda to get teams which has a member with jersey number X. For example:

filter with 4 will get Red, Black
filter with 11 will get Red and Blue.

I know how to filter only at player level, like

players.stream().filter(p->p.number.equal(X))

or flatmap to get a list of players

teams.stream().flatmap(t->t.getPlayers())

but how to I mix these lambda to get teams with a property filter on player?

标签: lambda java-8
1条回答
Root(大扎)
2楼-- · 2019-05-17 09:09

The solution may look like this:

int playerNumber = ...;
List<Team> filteredTeams = 
    teams
    .stream()
    .filter(
        t -> t.getPlayers().stream().anyMatch(p->p.number==playerNumber)
    )
    .collect(Collectors.toList());
查看更多
登录 后发表回答