使用F#进行多场验证(在天蓝色函数内)

时间:2017-01-25 18:41:21

标签: f# azure-functions

我有一个基于http post模板的azure函数。我将json从1 prop扩展为3.

match isNull versionJ, isNull customerIdJ, isNull stationIdJ with

检查所有三个空值的最佳方法是什么?使用tulple?

public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/css/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.formLogin()
        .loginPage("/login")
        .loginProcessingUrl("/login")
        .and()
        .authorizeRequests()
        .antMatchers(HttpMethod.GET, "/login", "/error").permitAll() 
        .anyRequest().authenticated(); //all other pages require users to be authenticated

}

3 个答案:

答案 0 :(得分:2)

在这种情况下,我认为使用简单的if是清洁剂解决方案, 如果您已将isNull定义为:

let inline isNull value = (value = null)

然后就这样做:

if isNull versionJ && isNull customerIdJ && isNull stationIdJ then
    // your code

答案 1 :(得分:2)

这取决于您想要检查的内容。 如果要查看至少有1个null,则可以执行以下操作:

let allAreNotNull = [versionJ; customerIdJ; stationIdJ] 
                    |> List.map (not << isNull)
                    |> List.fold (&&) true

如果要检查所有这些是否为空,则可以执行以下操作:

let allAreNull = [versionJ; customerIdJ; stationIdJ]
                 |> List.map isNull
                 |> List.fold (&&) true

<强>更新

您也可以将其替换为List.forall

[versionJ; customerIdJ; stationIdJ]
|> List.forall (not << isNull)


[versionJ; customerIdJ; stationIdJ]
|> List.forall isNull

答案 2 :(得分:2)

另一种方法受到申请人的启发,如果所有元素createRecord都适用(<>) null

let createRecord v c s  = v, c, s

let inline ap v f =
  match f, v with
  | _     , null
  | None  , _     -> None
  | Some f, v     -> f v |> Some

let v =
  Some createRecord 
  |> ap json.["version"]
  |> ap json.["customerId"]
  |> ap json.["stationId"]