如何迭代List [Result]并返回一个布尔值/ Result?

时间:2019-06-16 08:32:50

标签: scala playframework

我有一个Future[List[Result]] 我需要运行一个逻辑,例如,如果列表中的所有项目均为Result.Ok,然后返回Result.Ok(或true),否则返回Result.BadRequest(或false)

我尝试过:   futureResultList.map(temp => temp.forall(_ == true))

但是此代码仅在列表包含布尔值时有效。如果包含Result个对象(更改检查to _ == Result.Ok时)不起作用

2 个答案:

答案 0 :(得分:8)

要返回Boolean,您只需在forall调用中更改谓词:

futureResultList.map(_.forall(_ == Result.Ok))

答案 1 :(得分:0)

概述此类示例的最简单方法是映射。如果您有结果列表,但需要布尔值列表,则将其映射。不要害怕多次映射,从长远来看,它会更具可读性:)

<div id="buttonLeft" class="ButtonLeft">
<asp:Panel runat="server" ID="pnlOutdoorPrice">
    <div id="outdoor" class="Price outdoor">
        <span class="Location">OUTDOOR</span><br />
        <asp:label runat="server" ID="lblOutdoor" Text="Price" CssClass="PriceLabel" />
    </div>
    <div id="containerOutdoor">
        <asp:Panel runat="server" ID="pnlOutdoorBookButton" Visible='<%# customFunctions.CheckinDateWithinSpecified(Convert.ToInt32(Eval("ProviderID")), this.txtCheckIn.Text) && customFunctions.CheckoutDateWithinSpecified(Convert.ToInt32(Eval("ProviderID")), this.txtCheckOut.Text)  %>'>
            <div class="BookButton">
                <asp:LinkButton ID="btnBookOutdoor" runat="server" CommandName="Outdoor">BOOK</asp:LinkButton>
            </div>
        </asp:Panel>
    </div>
</asp:Panel></div>

$(function () {
    $('.ButtonLeft').hover(function () {
        $(this).find('.outdoor').addClass('PriceHover');
    }, function () {
        $(this).find('.outdoor').removeClass('PriceHover');
    });
});

或更简洁:

val futureResultList: Future[List[Result]] = ???
val futureBooleanList: Future[List[Boolean]] = futureResultList.map(_.map(_ == Result.OK))

val result = futureBooleanList.map(temp => temp.forall(_ == true))

当然,正如其他人所建议的,直接去检查Result对象的相等性。但是,映射通常对于在类型之间导航以及获得更清晰,更易读的代码很有用。