수색…


비고

스칼라에는 일류 함수가있다.

함수와 메소드의 차이점 :

함수는 스칼라의 한 메소드가 아닙니다 : 함수는 값이며, 그 자체로 할당 될 수 있습니다. 반면에 def ( def 사용하여 만든 메소드)는 클래스, 특성 또는 객체에 속해야합니다.

  • 함수는 컴파일 타임에 특성 (예 : Function1 )을 확장하는 클래스로 컴파일되고 런타임에 값으로 인스턴스화됩니다. 다른 한편으로, 방법은 그들의 계급, 특성 또는 대상의 구성원이며, 그 밖에 존재하지 않습니다.
  • 메서드가 함수로 변환 될 수는 있지만 함수를 메서드로 변환 할 수는 없습니다.
  • 메소드는 타입 매개 변수화를 가질 수 있지만 함수는 그렇지 않습니다.
  • 메서드는 매개 변수 기본값을 가질 수 있지만 함수는 매개 변수 기본값을 가질 수 없습니다.

익명 함수

익명 함수는 정의되었지만 이름이 지정되지 않은 함수입니다.

다음은 두 개의 정수를 취하여 합을 반환하는 익명의 함수입니다.

(x: Int, y: Int) => x + y

결과 표현식을 val 할당 할 수 있습니다.

val sum = (x: Int, y: Int) => x + y

익명 함수는 주로 다른 함수의 인수로 사용됩니다. 예를 들어, 콜렉션의 map 함수는 다른 함수를 인수로 기대합니다.

// Returns Seq("FOO", "BAR", "QUX")
Seq("Foo", "Bar", "Qux").map((x: String) => x.toUpperCase)

익명의 함수의 인수 타입은 생략 될 수 있습니다. 타입은 자동으로 유추됩니다 :

Seq("Foo", "Bar", "Qux").map((x) => x.toUpperCase)

인수가 하나만있는 경우 해당 인수 주변의 괄호를 생략 할 수 있습니다.

Seq("Foo", "Bar", "Qux").map(x => x.toUpperCase)

밑줄은 속기

인수의 이름을 필요로하지 않는 더 짧은 구문이 있습니다. 위의 발췌 문장은 다음과 같이 작성할 수 있습니다.

Seq("Foo", "Bar", "Qux").map(_.toUpperCase)

_ 는 익명의 함수 인수를 위치 적으로 나타냅니다. 여러 매개 변수가있는 익명의 함수로 _ 이 나타날 때마다 다른 인수를 참조합니다. 예를 들어, 다음 두 표현식은 동일합니다.

// Returns "FooBarQux" in both cases
Seq("Foo", "Bar", "Qux").reduce((s1, s2) => s1 + s2)
Seq("Foo", "Bar", "Qux").reduce(_ + _)

이 속기를 사용할 때, 위치 _ 표시되는 인수는 동일한 순서로 한 번만 참조 될 수 있습니다.

매개 변수가없는 익명의 함수

매개 변수를 사용하지 않는 익명 함수의 값을 만들려면 매개 변수 목록을 비워 둡니다.

val sayHello = () => println("hello")

구성

기능 구성은 두 가지 기능이 작동하고 단일 기능으로 간주되도록합니다. 수학적 용어로 표현하면, 함수 f(x) 와 함수 g(x) 주어진다면, 함수 h(x) = f(g(x)) 이다.

함수가 컴파일되면 Function1 과 관련된 유형으로 컴파일됩니다. Scala는 composition : andThencompose 와 관련된 Function1 구현에서 두 가지 메소드를 제공합니다. compose 메소드는 위의 수학적 정의와 다음과 같이 적합합니다.

val f: B => C = ...
val g: A => B = ...

val h: A => C = f compose g

andThen ( h(x) = g(f(x)) )는 'DSL 식'느낌이 더 andThen .

val f: A => B = ...
val g: B => C = ...

val h: A => C = f andThen g

새로운 익명의 함수는 fg 통해 닫힌 상태로 할당됩니다. 이 함수는 두 경우 모두 새로운 함수 h 에 바인딩됩니다.

def andThen(g: B => C): A => C = new (A => C){
  def apply(x: A) = g(self(x))
}

f 또는 g 중 하나가 부작용을 통해 작동하면 h 를 호출하면 fg 의 모든 부작용이 순서대로 발생합니다. 동일한 변경 가능한 상태 변화에 대해서도 마찬가지입니다.

PartialFunctions와의 관계

trait PartialFunction[-A, +B] extends (A => B)

모든 단일 인수 PartialFunctionFunction1 이기도합니다. 이는 공식 수학적 의미에서 반 직관적이지만 객체 지향 디자인에 더 적합합니다. 이러한 이유로 Function1 은 상수 인 true isDefinedAt 메소드를 제공 할 필요가 없습니다.

부분 함수 (함수이기도 함)를 정의하려면 다음 구문을 사용합니다.

{ case i: Int => i + 1 } // or equivalently { case i: Int ⇒ i + 1 }

자세한 내용은 PartialFunctions를 살펴 보십시오 .



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow