Java Stream>是否可以将“orElseGet”内联到父流中?

时间:2017-01-25 00:28:04

标签: java java-8 java-stream optional

我不确定如何构建这个问题,所以请耐心等待......

1)除了添加Stream并随后过滤掉{{}之外,是否有更好的(又称更“正确”)方式来实例化null个可选元素1}}的?

null

2)其次,有没有办法将以下Stream.of( ... , person.likesRed() ? Color.RED : null) .filter(Objects::nonNull) ... 函数“内联”到父orElseGet / Stream

map

完整的(人为的)例子:

.map(p -> ofNullable(p.getFavouriteColours()).orElseGet(fallbackToDefaultFavouriteColours))

1 个答案:

答案 0 :(得分:1)

更清晰的表达方式是

Stream.concat(Stream.of(Color.BLUE, Color.GREEN),
              person.likesRed()? Stream.of(Color.RED): Stream.empty())

这并不比你的原始表达式简单,但它不会产生插入某些东西的坏感觉,只是为了过滤掉它,或者更抽象的是,丢弃之后必须重建的已知信息。 / p>

甚至存在技术差异。上面的表达式创建了一个具有已知大小的流,可用于优化某些操作。相比之下,使用filter的变体只有估计的大小,这将是过滤前的元素数量,但不是已知的确切大小。

不过度使用Optional

,可以大大简化周围的代码
public Response getFavouriteColours(final String personId) {
    Person person = personService.findById(personId);
    if(person == null) return Response.createNotFound();

    List<String> favouriteColours = person.getFavouriteColours();
    if(favouriteColours == null)
        favouriteColours = Stream.concat(
                Stream.of(Color.BLUE, Color.GREEN),
                person.likesRed()? Stream.of(Color.RED): Stream.empty())
            .map(Color::getName)
            .collect(Collectors.toList());

    return Response.createSuccess(favouriteColours);
}

即使Stream操作本身并不比传统的命令式代码简单:

public Response getFavouriteColours(final String personId) {
    Person person = personService.findById(personId);
    if(person==null) return Response.createNotFound();

    List<String> favouriteColours = person.getFavouriteColours();
    if(favouriteColours==null) {
        favouriteColours=new ArrayList<>();
        Collections.addAll(favouriteColours, Color.BLUE.getName(), Color.GREEN.getName());
        if(person.likesRed()) favouriteColours.add(Color.RED.getName());
    }
    return Response.createSuccess(favouriteColours);
}

虽然更复杂的示例可能会从Stream API使用中受益,但使用Optional可能会因更复杂的操作而变得更好。如果链中的所有缺失值或过滤器不匹配应该在链的末尾以相同的方式处理,则可选操作链可以简化代码。但是,如果在您的示例(以及大多数现实生活场景)中,每个缺席值都应该获得不同的处理或单独报告,使用Optional,尤其是嵌套使用Optionals,不会改进代码。