我们可以在流中提取主要对象

时间:2018-01-08 18:46:00

标签: java java-8 java-stream

我有一个包含FootballTeam类的Footballer类。如果FootballTeam包含具有特定FootballTeam的{​​{1}},则可以使用流从足球队列表中获取Footballer。是否可以使用流进行以下操作。即同时获取idtargetFootballer;

targetTeam

1 个答案:

答案 0 :(得分:7)

不要考虑循环,而是考虑您正在执行的高级操作,例如:找到符合条件的第一个元素。表达此类操作的最大障碍是Java方法无法返回两个值。使用Map.Entry作为保存两个结果的对类型,您可以使用

Map.Entry<FootballTeam,Footballer> target = list.getFootballTeams()
    .stream()
    .flatMap(team -> team.getFootballers()
                     .stream()
                     .filter(f -> f.getId() == 1)
                     .map(f -> new AbstractMap.SimpleImmutableEntry<>(team, f)))
    .findFirst()
    .orElse(null);

由于您可能希望对这些值执行后续操作,因此可以避免将结果存储在变量中并直接应用操作,例如

list.getFootballTeams()
    .stream()
    .flatMap(team -> team.getFootballers()
                     .stream()
                     .filter(f -> f.getId() == 1)
                     .map(f -> new AbstractMap.SimpleImmutableEntry<>(team, f)))
    .findFirst()
    .ifPresent(e -> {
        FootballTeam targetTeam = e.getKey();
        Footballer targetFootballer = e.getValue();
        // do your action
    });

此处,只有在找到匹配项且您不需要显式代码处理缺席值时才会执行操作。在第一个示例中,.orElse(null)表示如果未找到匹配项,则target应为null,因此您必须稍后测试null