소개 | 이 글에서는 주로 Kotlin 함수의 사용법과 함수형 프로그래밍에 대한 나의 이해를 소개합니다. 그리고 Python 및 C++와 몇 가지 비교를 해볼 것입니다. |
Google의 아버지가 Kotlin을 대자로 발표한 이후 Kotlin은 주요 커뮤니티에서 큰 인기를 얻었습니다.
Kotlin 구문에 대해 전혀 모르는 경우, 더 깊은 이해를 위해 이 기사를 읽기 전에 공식 문서나 중국어 웹사이트(https://www.kotlincn.net/docs/reference/)를 읽어보는 것이 좋습니다.
다음은 Wikipedia의 함수형 프로그래밍에 대한 정의입니다.
함수형 프로그래밍이라고도 하는 함수형 프로그래밍(영어: 함수형 프로그래밍)은 컴퓨터 작업을 수학적 함수 계산으로 처리하고 프로그램 상태 및 휘발성 객체의 사용을 피하는 프로그래밍 패러다임입니다. 함수형 프로그래밍 언어의 가장 중요한 기초는 람다 계산입니다. 그리고 람다 미적분학의 함수는 함수를 입력(인수) 및 출력(보내는 값)으로 받아들일 수 있습니다.
고차 함수의 정의는 다음과 같습니다.
수학과 컴퓨터 과학에서 고차 함수는 다음 조건 중 하나 이상을 충족하는 함수입니다. 하나 이상의 함수를 입력으로 받아들이고 함수를 출력합니다
함수형 프로그래밍의 가장 중요한 기초가 고차 함수라고 추론하는 것은 어렵지 않습니다. 즉, 지원 함수는 함수를 입력(인수) 및 출력(보내는 값)으로 받아들일 수 있습니다.
Kotlin의 일류 시민으로서 함수는 다른 객체와 마찬가지로 함수의 입력 및 출력으로 사용될 수 있습니다. 이는 Java 프로그래머가 Kotlin으로 전환할 때 가장 큰 변화와 가장 이해하기 어려운 점입니다. 이전에 Python 또는 C++11을 배운 적이 있다면 이것이 더 쉬울 수 있습니다. 이것이 바로 이 글에서 Kotlin 함수와 함수형 프로그래밍을 주로 소개하는 이유입니다.
Kotlin 기능다음은 Kotlin의 일반적인 함수 정의입니다. Java와의 차이점은 함수 매개 변수가 마지막에 배치되고 반환 값 유형이 마지막에 배치된다는 것입니다. 함수 본문은 등호를 사용하여 함수 정의에 할당할 수 있으며, 여기서도 함수와 변수의 동등성을 확인할 수 있습니다.
으아악또한 Kotlin은 함수 기본 매개변수, 확장 함수, 중위 표현식도 지원합니다. 다음은 간단한 예입니다.
으아악기본 매개변수를 지원하는 함수는 함수 오버로드를 줄일 수 있습니다.
String 객체에는 문자인지 여부를 판별하는 메소드가 없습니다. Java에서는 일반적으로 일부 Utils 메소드를 정의하는 반면 Kotlin에서는 클래스 확장 함수를 정의할 수 있습니다.
두 번째 예는 Int 클래스에 대한 확장 함수를 정의하는 것으로, 확장 함수를 중위 표현으로 표현하여 개발자에게 유사한 키워드를 정의할 수 있는 권한을 부여합니다.
예를 들어 다음과 같은 지도 객체를 만들 수 있습니다.
으아악여기에는 다음과 같이 정의된 중위 표현식이 있습니다.
으아악Pair는 Map에 저장된 객체이므로 이렇게 생성할 수도 있습니다
으아악Python에서는 함수가 여러 값을 반환하도록 하려면 튜플을 반환할 수 있습니다. Kotlin도 구조 분해 원리를 기반으로 비슷한 기능을 수행할 수 있습니다.
으아악사용자 정의 개체가 구조 분해를 지원하는 방법에 대한 공식 문서를 확인하세요. Map은 구조 분해를 지원하므로 다음과 같이 탐색할 수 있습니다.
으아악 고차 함수 및 람다 표현식"람다 표현식"(lambda 표현식)은 수학의 람다 계산을 기반으로 명명된 익명 함수입니다. 람다 추상화(lambda abstraction)에 직접적으로 해당하는 함수입니다. 함수 이름. 람다 표현식은 클로저를 나타낼 수 있습니다(기존 수학적 의미와 다르다는 점에 유의하세요).
Python의 람다 표현식:
으아악C++의 람다:
으아악Kotlin의 람다:
으아악Kotlin은 강력한 형식의 언어로서 비교적 간단합니다.
다음과 같이 람다 표현식을 사용할 수 있습니다.
으아악함수처럼 ()를 사용하여 호출할 수 있습니다. Kotlin에서는 연산자를 오버로드할 수 있습니다. () 연산자는 클래스의 오버로드된 함수 호출()에 해당합니다.
다음과 같이 변수를 정의할 수도 있습니다.
으아악일반 변수가 아니며 함수를 가리켜야 하며 함수 서명이 일관되어야 합니다.
으아악이 변수는 람다 식, 다른 람다 식 변수 또는 일반 함수와 동일할 수 있지만 함수 참조를 얻으려면 함수 이름 앞에 (::)를 추가해야 합니다.
이것은 C++의 함수 포인터와 유사합니다. 그러나 Python에서는 함수 이름을 함수 참조로 직접 사용할 수 있습니다.
으아악Kotlin으로 돌아가서 다음과 같이 하나의 함수를 다른 함수로 전달할 수도 있습니다.
으아악첫 번째 매개변수는 List이고, 두 번째 매개변수는 함수이며, List의 각 요소에 대해 두 번째 함수를 한 번씩 실행하는 것이 목적입니다. 사용 방법:
으아악두 번째 매개변수는 람다 표현식에 직접 전달됩니다. 물론 함수 참조도 전달할 수 있습니다.
으아악효과는 위 코드와 동일합니다.
C++에서 함수 포인터를 사용하면 비슷한 효과를 얻을 수 있습니다.
으아악다시 Kotlin으로 돌아가서, 함수가 입력 매개변수로 매개변수 목록의 마지막 함수인 경우 이 작업을 수행하고 중괄호 안에 직접 작성할 수도 있습니다.
으아악gradle 구성 파일을 작성하는 방식과 조금 비슷하지 않나요? Kotlin에서 도메인별 언어(DSL)를 쉽게 작성할 수 있습니다
또한 Kotlin은 로컬 함수와 함수를 반환 값으로 지원합니다. 다음 코드를 참조하세요.
fun main(args: Array) { val addResult = lateAdd(2, 4) addResult() } //局部函数,函数引用 fun lateAdd(a: Int, b: Int): Function0 { fun add(): Int { return a + b } return ::add }
在lateAdd内部定义了一个局部函数,最后返回了该局部函数的引用,对结果使用()操作符拿到最终的结果,达到延迟计算的目的。
函数作为一级公民当然可以像普通对象一样放进map中,比如下面这样:
val funs = mapOf("sum" to ::sum) val mapFun = funs["sum"] if (mapFun != null) { val result = mapFun(1,2) println("sum result -> $result") } fun sum(a: Int, b: Int): Int { return a + b }
将一个函数引用作为value放进了map中,取出来之后使用()操作符调用,可以简化一些if,else的场景。
基于以上函数式编程的特性,Kotlin可以像RxJava一样很方便的进行相应式编程,比如:
fun printUpperLetter(list: List) { list .filter (fun(item):Boolean { return item.isNotEmpty() }) .filter { item -> item.isNotBlank()} .filter { item -> if (item.isNullOrEmpty()) { return@filter false } return@filter item.matches(Regex("^[a-z|A-Z]$")) } .filter { it.isLetter() } .map(String::toUpperCase) .sortedBy { it } .forEach { print("$it, ") } println() }
上面的代码只是做演示,并无实际意义。具体语法请查看官方文档。
我相信Kotlin作为一种强类型的现代化语言可以在保证稳定性的同时极大地提高开发者的开发效率。
위 내용은 Kotlin 함수 사용 및 함수형 프로그래밍 원리에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!