홈>
일부 조건에 따라 플래그를 반환하는 함수가 있습니다.
같은 방법으로 더 나은 스칼라 방법이 있는지 알아 보려고합니까?
기본적으로 사람의 상태에 따라 pass_ind 플래그에서 파생되도록 다른 규칙을 적용해야합니다.
개인 상태가 학생 또는 실업인 경우 소득에 관한 규칙이 있으며, 개인 또는 학생 상태가 학생 또는 실업자가 아닌 경우 점수 및 소득에 적용되는 다른 규칙이 있습니다
def IncomeScreenStatus(status_cd: Option[String],
score: Option[Int],
income: Option[Double]) : String = {
var pass_ind : String = "F"
if (score.isDefined && income.isDefined && status_cd.isDefined) {
val score : Int = score.get
val income : Double = income.get
val status_cd : String = status_cd.get
if (status_cd == "STUDENT" || status_cd == "UNEMPLOYMENT") {
pass_ind = (status_cd, income) match {
case ("UNEMPLOYMENT", income) if income <= 7000 => "P"
case ("STUDENT", income) if income <= 18000 => "P"
case _ => "F"
}
}
else {
pass_ind = (income, score) match {
case (income, score) if (score < 100 || score > 150) && income <= 8500 => "P"
case (income, score) if (score <= 167 && score >= 100) && income <= 10500 => "P"
case _ => "F"
}
}
}
pass_ind
}
- 답변 # 1
- 답변 # 2
어쩌면 이렇게 될까요? (나는 그것을 시도하지 않았으며 그것이 정확하다는 것을 보증하지 않습니다.)
def IncomeScreenStatus( mb_status_cd : Option[String], mb_score : Option[Int], mb_income : Option[Double]) : String = { def nsu( score : Int, income : Double ) = { // neither student nor unemployed if ( (score < 100 || score > 150) && income <= 8500 ) "P" else if ( (score <= 167 && score >= 100) && income <= 10500 ) "P" else "F" } ( mb_status_cd, mb_score, mb_income ) match { case ( Some( "STUDENT" ), Some( score ), Some( income ) ) if ( income <= 18000 ) => "P" case ( Some( "UNEMPLOYMENT" ), Some( score ), Some( income ) ) if ( income <= 7000 ) => "P" case ( Some( "STUDENT" | "UNEMPLOYMENT" ), Some( _ ), Some( _ ) ) => "F" case ( Some( _ ), Some( score ), Some( income ) ) => nsu( score, income ) case _ => "F" } }
- 답변 # 3
여기에 첫 번째 균열이 있습니다.
def IncomeScreenStatus(status_cd: Option[String] ,score : Option[Int] ,income : Option[Double]) : String = { for { stat <- status_cd scr <- score incm <- income } yield stat match { case "UNEMPLOYMENT" => if (incm <= 7000) "P" else "F" case "STUDENT" => if (incm <= 18000) "P" else "F" case _ => if ((scr < 100 || scr > 150) && incm <= 8500 || (scr <= 167 && scr >= 100) && incm <= 10500) "P" else "F" } }.getOrElse("F")
전달 된 매개 변수와 같은 이름으로 지역 변수를 생성하면 실제로 컴파일러가 혼동됩니다.
- 답변 # 4
함수 프로그래밍에서는 큰 함수 대신 작은 함수를 사용하는 것이 좋습니다. 아래처럼 무언가를 선호합니다 :
def screenStudent(income:Double):String = { if (income <= 18000) "P" else "F" } def screenUnemployment(income:Double):String = { if (income <= 7000) "P" else "F" } def screenOthers(income:Double, score:Int):String = { (income, score) match { case (income, score) if (score < 100 || score > 150) && income <= 8500 => "P" case (income, score) if (score <= 167 && score >= 100) && income <= 10500 => "P" case _ => "F" } } def incomeScreenStatus( status_cd: Option[String], score: Option[Int], income: Option[Double] ) : String = (status_cd , score, income) match { case (Some("STUDENT"), Some(_), Some(i)) => screenStudent(i) case (Some("UNEMPLOYMENT"), Some(_), Some(i)) => screenUnemployment(i) case (Some(_), Some(s), Some(i)) => screenOthers(i, s) case _ => "F" }
- 답변 # 5
예를 들어 각 필드를 정의해야하므로
Option
를 압축 할 수 있습니다 함께. 또한 본인의 진술서에 명시 적 경비원 대신 추출기를 사용하고 싶습니다.귀하의 상태가 유한 세트 인 경우
sealed trait
를 사용하는 것이 좋습니다. 그것을 표현하기 위해.object Example { sealed trait Status case object Student extends Status case object Unemployed extends Status case object Other extends Status object PoorStudent { def unapply(income: Int) = if (income <= 18000) Some(income) else None } object PoorUnemployed { def unapply(income: Int) = if (income <= 7000) Some(income) else None } object IncomeScoreRange { def unapply(score: Int, income: Double) = if (((score < 100 || score > 150) && income <= 8500) || (income <= 10500 && (100 to 167 contains score))) Some((score, income)) else None } def compute(status: Option[Status], score: Option[Int], income: Option[Double]): String = { (status, score, income).zipped .collect { case (Student, _, PoorStudent(_)) => "P" case (Unemployed, _, PoorUnemployed(_)) => "P" case (Other, IncomeScoreRange(_, _)) => "P" } .headOption .getOrElse("F") } }
관련 자료
- rust - 옵션에서 패턴 일치시 혼란스러운 동작
- sed - 여러 줄의 일치 패턴
- StackScreen의 React Native 여러 옵션 (params title + headerRight 버튼)
- 암시 적 유형과 일치하는 Haskell 패턴
- awk - 패턴을 검색하고 패턴 매칭 라인에서 다음 라인을 인쇄합니다
- 일치하는 여러 열이있는 Excel 시트로 새 데이터를 병합/가져 오는 방법
- dataframe - 여러 데이터 프레임간에 일치하는 값 조합을 찾으십니까? 아르 자형
- linux - 유닉스 쉘 스크립트를 사용하여 여러 열을 비교하고 일치하지 않는 열을 인쇄하는 방법
- regex - SQL 하위 문자열 패턴 일치 (TERADATA)
- python - 서로 다른 그룹의 패턴을 일치시키는 Groupby
- agda - std-lib : 목록 : snoc과 일치하는 패턴
- active directory - Powershell은 Get-ADUser에서 문자열 패턴과 일치하는 속성 만 가져옵니다
- python - 여러 행을 일치시켜 Pandas 데이터 프레임 정렬
- python - spacy - 패턴 매칭
- python - S3 boto3에서 여러 파일 및 특정 패턴을 삭제하는 방법
- linux - 사용자 정의 데이터 형식화 및 패턴 일치
- fiware orion - 동일한 ID 패턴으로 여러 생성 된 엔티티에 속성 추가
- stata - 정규식을 사용하여 패턴을 여러 번 일치
- python - 복잡한 문자열에서 주어진 패턴과 일치하는 부분 문자열을 구문 분석
- jquery - 선택한 여러 데이터 속성과 일치하는 요소 표시
트렌드
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- JavaScript 변수를 HTML div에 '출력'하는 방법
- python - 문자열에서 특정 문자 제거
우선 스칼라가 채택한 권장 코드 스타일에 대한 의견이 거의 없습니다.
변수/함수/def 이름은
camelCase
로되어 있습니다incomeScreenStatus
IncomeScreenStatus
대신 .statusCd
status_cd
대신passInd
pass_ind
대신이제